월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.remove 동작 안함 이유?
Member.classpackage dev.devpool.domain; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "MEMBER_ID") private long id; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) List<Child> children = new ArrayList<>(); public List<Child> getChildren() { return children; } public void setChildren(List<Child> children) { this.children = children; } private String name; private String nickName; private String email; private String password; public Member() { } public Member(String name, String nickName, String email, String password) { this.name = name; this.nickName = nickName; this.email = email; this.password = password; } public long getId() { return id; } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public String getName() { return name; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } Child.classpackage dev.devpool.domain; import javax.persistence.*; @Entity public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @ManyToOne @JoinColumn(name = "MEMBER_ID") private Member member; public long getId() { return id; } public void setId(long id) { this.id = id; } public Member getMember() { return member; } public void setMember(Member member) { this.member = member; } }로 부모를 Member 자식을 Child로 만들고 delete 시 cascade가 적용되는지를 체크하려 하였습니다. MemberRepository에서 delete 쿼리를 아래와 같이 작성하였습니다.Test 코드는 아래와 같습니다.@Test public void ss() { Member member = new Member(); member.setName("김우"); member.setEmail("rereers15@naver.com"); member.setPassword("taeu4"); member.setNickName("귀요미"); Child child = new Child(); child.setMember(member); member.getChildren().add(child); memberService.join(member); em.flush(); em.clear(); System.out.println("================"); memberService.delete(member.getId()); System.out.println("================"); } SQL 하지만 em.remove 부분이 동작하지 않습니다.이유가 무엇인가요? ** save메서드에서 저장 후 remove()를 하는 것을 실험해보았는데 이 경우는 delete 쿼리까지 정상 출력됩니다. 영속성 컨텍스트와 @Transaction과 관련된 이슈인 것같은데 이와 관련해서 설명해주시면 감사하겠습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Entity Builder 패턴과 값 수정 관련해서 질문드립니다.
Entity의 경우 불변성을 위해 Setter를 사용하지 않고 Builder패턴을 사용중인데요.불편한점이 생겼습니다. 회원 Entity의 경우 필드가 30개 정도 되는데요.패스워드 3회 실패 시 상태값(isActive) 필드만 수정을 하고 싶은데Setter가 있다면 해당 회원ID로 조회 후 memberEntity.setIsActive(False)로 입력해주면DirtyChecking으로 간단하게 원하는 로직이 구현되는데builder 패턴이다 보니 아래 처럼 구현을 하고 있습니다.MemberEntity originMember = memberRepository.findById(memberId);MemberEntity memberForUpdate = MemberEntity.builder().id(originMember.getId()).address(originMember.getAddress()).isActive(true)...........build();memberRepository.save(memberForUpdate );이런 경우에 Builder패턴을 사용하면서 좋은 해결책이 있을까요? 상태와 관련된 필드만 @Setter를 넣자니(제 짧은 생각이지만 changeStatus method로 필드값 변경하는 방법도 setter와 동일해보입니다. 오히려@Setter가 코드간결성에서 더 좋아보이는 제 생각입니다.)해당 필드도 무분별하게 변경이 되면 안되는 중요한필드라 애매한 상황입니다. 도와주세요 !
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
1차 캐시의 범위에 대한 질문
https://www.inflearn.com/questions/264414https://www.inflearn.com/questions/659914위에 있는 유사한 내용의 질문에 각각 상반되는 답변이 적혀있어 이를 확실하게 알고 싶어서 질문드립니다.위의 질문을 내용을 보면,영속성 컨텍스트(StatefulPersistenceContext) 내부에 프록시 객체를 저장하는 MAP과 실제 엔티티 객체를 저장하는 MAP이 따로 존재하는 것으로 보입니다.강의에서 영한님이 1차 캐시라고 말씀 하신 내용은 저 두 개의 MAP중 엔티티 객체를 저장하는 MAP이라고 이해를 하면 될까요?아니면, 1차 캐시라고 말씀하신 내용에 두개의 MAP 모두 포함하는 의미로 생각하면 될까요? + 만약 getReference() 함수를 통해 갖고온 프록시 객체를 초기화하지 않은 상태로 detach()를 이용해 준영속상태로 만들게 된다면, 해당 프록시 객체는 더이상 영속성 컨텍스트의 도움을 받을 수 없기때문에, 초기화가 불가능하다고 이해했는데요.이 때 이 프록시 객체는 위에 프록시 객체를 저장하는 MAP으로부터 제거가 된 것을 detach() 되었다고 생각해도 될까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
에러 발생합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 검색해봤는데, 찾는 내용을 못찾아서 질문드립니다. 괜히 늦은시간에 질문올려 알람 때문에 깨시는건 아닐지. 만약에 그렇다면 죄송하단 말씀 먼저 전합니다!아래에 스크린샷 첨부하겠습니다.강의에서는 자동완성도 뜨는데, 제 경우에는 안떠서요..! 맞게 입력한거 같긴한데, 저 빨간색으로 뜨는 원인을 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 변경감지 질문있습니다.
안녕하세요... 변경감지 질문드립니다.지금은 entity만 사용하고있는데 계층간에서는 dto를 사용하는 걸로알고있습니다.그럴경우 엔티티에 있는 updateXxxx메소드를 dto에 옮겨야하나요? 만약 옮긴다면 변경감지가 안되는데 그럴경우 어떻게해야하는지...save를 콜해야하는지..updateXxxx정도는 엔티티에 있어도 되는지 궁금합니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 매서드 add 쓰는 이유??..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.연관 관계 매서드에서public void setMember(Member member){ this.member = member; member.getOrders().add(this); } 이런식으로 member의 add함수를 쓰던데 member 객체는 리스트 타이 아닌데 어떻게 가능한거죠???
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 select관련해서 질문드립니다!
EntityManager가 tx종료와 동시에 지워진다고 하셨는데,만약 dml쿼리없이 단순 select만 하게되어서EntityTransaction tx = em.getTransaction(); tx.begin();위의 코드없이 select만 여러번 실행하게될 경우 em가 생겼다 지워졌다 생겼다 지워졌다가 반복된다고 보면 될까요??위와같이 이해를 하여서, 위의 코드를 지우고 아래의 코드를 실행하면, 하나의 트랜잭션으로 묶지 않았기에 두번의 쿼리가 나갈것이라 예상했지만, 쿼리가 한번만 나가는것 같아서요Member member1 = em.find(Member.class, 101L); Member member2 = em.find(Member.class, 101L);
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다 데이터 조회 질문입니다.
강사님 강의를 보고 최근에 프로젝트를 하다 궁금한게 생겨 질문 남기게 되었습니다. Product <-> Category Entity 다대다 매핑을 위해product(OneToMany) <-> product_category(ManyToOne) <-> category(OneToMany)위와 같은 테이블로 매핑한 상태이고 join 상속 전략으로 district_category 테이블도 생성 하였습니다.district_category를 쿼리 파라미터로 받고 해당 district_category를 갖고 있는 상품들을 검색하고 페이징을 하는 로직을 짠다고 했을때 두가지 방법이 생각났는데 둘 중 어느게 더 적합한지 모르겠습니다 검색어를 바탕으로 product_category에서 Product를 EntityGraph로 같이 찾은 후에 찾은 ProductCategory.getproduct() 와 같은 방식SearchServiceCategory category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return new ProductCategoryToProductPage(productCategoryRepository.findAllByCategory(pageable, category));ProductCategoryRepository@EntityGraph(attributePaths = "product") Page<ProductCategory> findAllByCategory(Pageable pageable, Category category);ProductCategoryToProduct public ProductCategoryToProductPage(Page<ProductCategory> page) { this.content.addAll(page.getContent().stream() .map(ProductCategory::getProduct) .map(ProductListGetResponseDTO::new) .collect(toList())); this.totalPages = page.getTotalPages(); this.totalElements = page.getTotalElements(); this.pageNumber = page.getNumber() + 1; this.size = page.getSize(); } 발생 쿼리문selectdistrictca0_.category_id as category2_1_,districtca0_1_.parent_id as parent_i3_1_,districtca0_.district_enum as district1_2_fromdistrict_category districtca0_inner joincategory districtca0_1_on districtca0_.category_id=districtca0_1_.category_idwheredistrictca0_.district_enum=?selectproductcat0_.product_category_id as product_1_8_0_,product1_.product_id as product_1_7_1_,productcat0_.category_id as category2_8_0_,productcat0_.product_id as product_3_8_0_,product1_.created_date as created_2_7_1_,product1_.content_detail as content_3_7_1_,product1_.product_content as product_4_7_1_,product1_.product_name as product_5_7_1_,product1_.product_price as product_6_7_1_,product1_.product_status as product_7_7_1_,product1_.product_thumbnail as product_8_7_1_fromproduct_category productcat0_left outer joinproduct product1_on productcat0_.product_id=product1_.product_idwhereproductcat0_.category_id=? limit ?selectcount(productcat0_.product_category_id) as col_0_0_fromproduct_category productcat0_whereproductcat0_.category_id=? 검색어를 바탕으로 product에서 직접 찾기 (데이터 뻥튀기의 문제는 쿼리dsl 이용 productId로 groupBy로 해결) 글 쓰고 생각해보니 A카테고리는 B라는 상품 안에서는 하나밖에 있을 수가 없으니 굳이 groupBy를 안써도 될거 같네요SearchService Category category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return productRepository.findAllByCategory(pageable, category);ProductRepository @Override public Page<Product> findAllByCategory(Pageable pageable, Category category) { List<Product> content = queryFactory.selectFrom(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .groupBy(product.productId) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); Long total = queryFactory .select(Wildcard.count) .from(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .fetchOne(); return new PageImpl<>(content, pageable, total); } 발생 쿼리문selectdistrictca0_.category_id as category2_1_,districtca0_1_.parent_id as parent_i3_1_,districtca0_.district_enum as district1_2_fromdistrict_category districtca0_inner joincategory districtca0_1_on districtca0_.category_id=districtca0_1_.category_idwheredistrictca0_.district_enum=?selectproduct0_.product_id as product_1_7_,product0_.created_date as created_2_7_,product0_.content_detail as content_3_7_,product0_.product_content as product_4_7_,product0_.product_name as product_5_7_,product0_.product_price as product_6_7_,product0_.product_status as product_7_7_,product0_.product_thumbnail as product_8_7_fromproduct product0_inner joinproduct_category productcat1_on product0_.product_id=productcat1_.product_idwhereproductcat1_.category_id=?group byproduct0_.product_id limit ?selectcount(*) as col_0_0_fromproduct product0_inner joinproduct_category productcat1_on product0_.product_id=productcat1_.product_idwhereproductcat1_.category_id=?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
변경감지 질문입니다.
변경감지가 되어 .persist없이 update문이 발생하는건 객체가 영속성 컨테이너에서 관리되고 있을때 만 변경감지가 일어아는건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa repository.save 메서드 구현 코드를 보고 싶습니다
강사님 안녕하세요~ 회사에서jpa 사용하면서 깊이 생각 안하고 사용하다가궁금한점이 생겼습니다 특정 리포지토리가 있다고 가정하겠습니다@Repositorypublic interface 리포지토리 extends JpaRepository<도메인, Long>, JpaSpecificationExecutor<도메인> { 리포지토리.save(); 하면 스프링프레임웍 하이버네이트 구현체가 실행해준다고 하는데저는 실제 프레임웍 구현체 소스 코드를 보고 싶습니다제가 IDE 이클립스를 사용중인데 어디라이브러리나소스 코드를 보면 될까요리포지토리.save() -> █이메서드를 클릭하면org.springframework.data.repository.CrudRepository 다시 인터페이스이고 @NoRepositoryBeanpublic interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S entity);=> █ CrudRepository 인터페이스의 save 메서드를 구현코드는또 어느라이브러리에 어떤 메서드를 확인하면 될까요? *.스프링, 스프링부트 강의 수강하며 계속 반복되는 얘기가유연하게 적용하기위해 많은 인터페이스를 사용하고구현체가 있다고 계속 얘기되는데그럼 그런 구현체를 최 하위의 클래스 메서드를 보는 방법이 어떻게 되는지 궁금하네요.. *.추가적으로 소스코드에는리포지토리.save(); =>인터페이스.save();인터페이스.메서드 를 호출했는데스프링 프레임웍에서 어떤 원리로인터페이스.메서드 => 구현체클래스.메서드가 호출되는지이해가 가지 않습니다 바쁘시겠지만 시간 나실때 답변 주시면 감사하겠습니다수고하세요.. #JPA#구현체#하이버네이트#hibernate
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
mappedBy 하실때 "" 따옴표 안에서 자동완성 방법
강사님처럼 mappedBy 따옴표 안에서ctrl + space 눌러봐도 자동완성 제안이 안내려옵니다..인텔리제이는 아래 버전 사용하고 있습니다
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
불변 클래스 정의와 관련된 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]불변 클래스를 정의하기 위해서 세터 메서드를 빼거나 private로 둘 수 있다고 하셨는데, JPA 내부적으로 테이블에서 가져온 값을 객체로 주입하기 위해서 세터 메서드를 호출하기 때문에 저렇게 할 수 없지 않나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
from절 서브쿼리 예시
hibernate 6부터 from절 subquery가 지원된다고 하셨는데 혹시 예시를 볼수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 전이+고아 객체 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 공부하다가 궁금한점이 생겨 질문 드립니다.CascadeType.ALL을 하면 굳이 orphanRemoval = true로 하지 않아도 em.remove(parent)나 parent.getChildList().remove()를 하는 경우 자식 엔티티가 제거된다고 이해를 하였습니다. 그러면은 CascadeType.ALL만 해줘도 부모 엔티티를 통해서 자식 엔티티의 persist, remove가 모두 가능하니 생명 주기를 관리할 수 있는 것 아닌가요? 굳이 orpahnRemoval = true를 해주어야 하는 이유가 궁금합니다. 제가 잘못 이해한 부분이 있는지 알려주시면 감사하겠습니다!
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
toString() 만 사용해도 프록시객체가 초기화되는 것이 맞나요?
일전에, 지연로딩 을 사용하면 객체의 참조를 얻을 때가 아닌, 실제 필드(메서드 포함) 에 접근할 때 프록시 객체가 진짜 객체로 초기화 되는 것으로 이해했습니다.그런데 아래와 같이 코드를 짜고 실행해보니, 객체의 참조를 얻을 때 쿼리가 나가는 것 처럼 보이더라고요.// 팀 Team teamA = new Team(); teamA.setName("팀A"); em.persist(teamA); Team teamB = new Team(); teamB.setName("팀B"); em.persist(teamB); // 회원: member1, 2 는 팀A 소속. member3은 팀B 소속 Member member1 = new Member(); member1.setUsername("회원1"); member1.setTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("회원2"); member2.setTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("회원3"); member3.setTeam(teamB); em.persist(member3); em.flush(); em.clear(); // Query String query = "select m from Member m"; List<Member> findMembers = em.createQuery(query, Member.class) .getResultList(); for (Member member : findMembers) { System.out.println("member = " + member.getUsername() + ", " + member.getTeam()); } tx.commit(); (나간 쿼리)Hibernate: /* select m from Member m */ select member0_.MEMBER_ID as MEMBER_I1_7_, member0_.createdBy as createdB2_7_, member0_.createdDate as createdD3_7_, member0_.lastModifiedBy as lastModi4_7_, member0_.lastModifiedDate as lastModi5_7_, member0_.COMPANY_CITY as COMPANY_6_7_, member0_.COMPANY_STREET as COMPANY_7_7_, member0_.COMPANY_ZIPCODE as COMPANY_8_7_, member0_.city as city9_7_, member0_.street as street10_7_, member0_.zipcode as zipcode11_7_, member0_.LOCKER_ID as LOCKER_15_7_, member0_.TEAM_ID as TEAM_ID16_7_, member0_.USERNAME as USERNAM12_7_, member0_.endDate as endDate13_7_, member0_.startDate as startDa14_7_ from Member member0_ Hibernate: select team0_.TEAM_ID as TEAM_ID1_10_0_, team0_.createdBy as createdB2_10_0_, team0_.createdDate as createdD3_10_0_, team0_.lastModifiedBy as lastModi4_10_0_, team0_.lastModifiedDate as lastModi5_10_0_, team0_.name as name6_10_0_ from Team team0_ where team0_.TEAM_ID=? member = 회원1, hellojpa.domain.Team@26ae880a member = 회원2, hellojpa.domain.Team@26ae880a Hibernate: select team0_.TEAM_ID as TEAM_ID1_10_0_, team0_.createdBy as createdB2_10_0_, team0_.createdDate as createdD3_10_0_, team0_.lastModifiedBy as lastModi4_10_0_, team0_.lastModifiedDate as lastModi5_10_0_, team0_.name as name6_10_0_ from Team team0_ where team0_.TEAM_ID=? member = 회원3, hellojpa.domain.Team@6bd16207 저는 위 코드 중 System.out.println 과정 중 프록시 객체가 초기화가 되어서 위같은 쿼리가 나왔다고 생각하는데 제 판단의 근거가 맞는지 궁금합니다.System.out.println("member = " + member.getUsername() + ", " + member.getTeam());System.out.println 을 사용하면 자동으로 객체.toString() 이 호출되고, 따라서 필드(메서드)에 접근 했으므로 이 시점에 프록시 객체가 엔티티로 초기화 되었다. 위 처럼 이해하는게 맞을까요? 항상 애써주시는 영한님과 서포터님들께 감사드립니다!!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
left join 시 on 부분 질문있습니다
JPQL:SELECT m FROM Member m LEFT JOIN m.team t on t.name = 'A'SQL:SELECT m.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A' 이와 같은 부분에서 left outer join 시 SQL에ON m.TEAM_ID=t.id이 부분은 왜 자동으로 추가가 되는 것인지 궁금합니다. inner join의 경우에는 조인 조건에 동일한 값을 가진 행을 결과에 표기하는 것이니 해당 부분이 추가되는 것이 이해가 가는데left outer join의 경우 m.TEAM_ID=t.id 이 성립하지 않는, m에만 값이 존재하는 부분까지 포함해서 왼쪽 테이블의 전부가 결과에 표기되는 방식이 아닌가요? 그냥 단순히 'm의 TEAM_ID 와 t의 id가 연관관계를 이룬다' 는 의미라고 이해하면 되는 부분일까요? 그리고 left outer join 시 on 절에 필터링 조건을 추가해도 left outer join 특성상 필터링으로 걸러진 행까지 다시 포함되서 결과가 반환되는데 무슨 의미가 있는지 잘 이해가 가지 않습니다. 제 생각으로는 select의 주체가 되는 값만 영속성 컨텍스트에 저장하는 일반 join에서는 의미가 없고 fetch join 같은 경우에 의미를 가진다고 생각되는데 제 생각이 맞는 걸까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블 연관관계 질문
예를들어, 하나의 주문에 짜장면2개, 짬뽕2개를 했다고 가정하면Order테이블에서는 1개의 데이터가 생성,OrderItem테이블에서는 2개의 데이터가 생성 되는게 맞을까요?그렇다고 한다면 Order에 대한 총액이 궁금할 때에는 Order에서 OrderItems를 구한 뒤, 각각의 orderPrice를 더하면 될까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
디비에 물리적 FK를 설정 하지 않고도 JPA 연관관계 사용이 가능한가요?
안녕하세요.좋은 강의 덕분에 학습 잘하여 정말 감사하다는 말씀 부터 드립니다.다름아니라, 디비에 물리적 fk를 설정하지 않고 테이블 연관관계 매핑을 하였을시 별다른 문제없이 JPA 연관관계를 사용할 수 있는지 궁금하여 질문드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
자식엔티티, 부모엔티티
강의를 보다보면 자식엔티티, 부모엔티티라는 말이 많이 나오는데 ManyToMany OneToOne ManyToOne OneToMany에서 자식엔티티, 부모엔티티를 어떻게 구분하나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
고아객체
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, orphanRemoval = true, cascade = CascadeType.PERSIST ) List<Child> children = new ArrayList<>();위에 코드에서 고아객체를 삭제했기 때문에 children.remove(0); 을 하면 첫번째 child가 삭제되어야 하지만 cascade = CascadeType.PERSIST를 제거하면 delete쿼리가 발생하지 않습니다 PERSIST는 영속화될 때 같이 영속화하는 속성으로 알고있는데 제거하면 고아객체 삭제가 왜 되지 않는것인지 궁금합니다. 그리고 mappedBy를 사용한 children은 주인이 아니라서 chindlren.add(child)를 해도 반영이 되지 않는걸로 알고있는데 PERSIST속성을 주면 주인이 아니여도 둘 다 영속화가 되는것인지 궁금합니다.