월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
임베디드 타입의 중첩
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)[질문 내용]@AttributeOverrides를 사용해 집주소, 회사주소를 정의할 때 이 방법에는 주소 엔티티를 따로 설계하는 것이 좋은 방법일까요? 아님 강의처럼 하는 것이 좋은 방법인가요 ?저는 뭔가 데이터베이스에 컬럼들이 낭비가 될지도 모르겠다는 생각이 들어서 차라리 엔티티로 분리하여 연관관계를 설정해주는게 더 좋을 것 같아서요.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실전 예제4 - 상속관계 매핑 13:20
상속관계 매핑 13:20 질문합니다.데이터가 인서트 되지 않습니다.한번 봐줄수 있을까요?https://github.com/InSuChoe/jpa
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
자바 ORM 표준 JPA 프로그래밍 - 기본편 / 상속관계 매핑 / 11:20초
하이버네이트가 테이블을 생성해주질 않습니다.깃 클론 링크 남깁니다.git@github.com:InSuChoe/jpa.git
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티마다 리포지토리를 생성하는 게 맞을까요?
간단한 게시판을 만들어보면서 Jpa를 학습하고 있습니다.Member, Post, LikedPost 엔티티는 이렇게 3개로 구성되어 있고 각각의 코드는 아래와 같습니다.Member@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; @OneToMany(mappedBy = "member") private List<Post> posts = new ArrayList<>(); @OneToMany(mappedBy = "member") private List<LikedPost> likedPosts = new ArrayList<>(); @Builder public Member(String name, String email) { this.name = name; this.email = email; } }Post@Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "MEMBER_ID") private Member member; private String title; @Lob private String content; @Builder public Post(Member member, String title, String content) { this.member = member; this.title = title; this.content = content; if (!member.getPosts().contains(this)) { member.getPosts().add(this); } } }LikedPost@Entity public class LikedPost { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "MEMBER_ID") private Member member; @ManyToOne @JoinColumn(name = "POST_ID") private Post post; @Builder public LikedPost(Member member, Post post) { this.member = member; this.post = post; if (!member.getLikedPosts().contains(this)) { member.getLikedPosts().add(this); } } } 여기서 제가 했던 고민은 LikedPost를 리포지토리를 만들어서 관리해야 하는지 아니면 그냥 PostRepository에서 관리해야 하는지였습니다.사실 LikedPost 자체는 비즈니스 로직이 있는 것도 아니고 단지 회원별로 좋아요를 누른 게시글을 탐색하기 위한 중간 테이블이기 때문에 굳이 개별적으로 리포지토리를 만들어야 하나 생각이 들었습니다.이런 경우에는 어떻게 구조를 가져가는 것이 좋을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 39분 00초 ~ 15초: Address 저장 관련 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음저와 비슷한 질문이 있는지 찾아보았는데, 없는 것 같아서 질문 드립니다. 혹시, 이미 질문 내용에 있는 것이라면 죄송합니다.제가 완전 초보여서, 강의 내용에 대한 이해가 부족해서 드린 엉뚱한 질문이라면 죄송합니다.강의 39분 00초 ~ 15초 사이의 h2DB 화면입니다.위와 같이 AddressEntity 를 이용해서 주소를 저장하면, 조인된 멤버 id 의 주소도 함께 변해야 하는 것이 아닌가요? 제가 잘못 알고 있는 걸까요 ㅠㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpql flush 자동 호출
jpql flush 자동 호출되는 것이 커밋까지 된다는 말씀이실까요?jpql 로 db 에서 데이터를 조회하려면 db 에 반영이 되어야할 것 같아서입니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
동일한 id 값으로 엔티티를 persist하면 에러가 발생하지 않는 이유는 무엇인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]아래와 같이 코드를 작성했을 때 왜 DB에 삽입도 안되고 Insert 쿼리가 생성되지 않는지 궁금합니다. DB에 id가 150인 칼럼이 저장되어 있지 않은 상태에서 아래 코드를 실행했습니다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); Member member1 = new Member(); member1.setId(150L); member1.setName("HelloJPA"); Member member2 = new Member(); member2.setId(150L); member2.setName("HelloJPA"); em.persist(member1); em.persist(member2); tx.commit(); 영한 님의 강의 대로라면 어쨌든 insert 문은 두 개가 생성이 되고, 트랜잭션이 commit 되면서 insert 쿼리가 DB로 날아가 PK Violation 등의 에러가 발생해야 할 것 같은데 그렇지 않은 이유가 궁금합니다. 아래와 같이 Member 객체를 하나만 생성해 저장하면 문제 없이 insert 쿼리가 날아가고 DB에도 정상적으로 저장됩니다.EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); Member member3 = new Member(); member1.setId(151L); member1.setName("HelloJPA"); em.persist(member3); tx.commit();
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 객체에 대해 질문이 잇습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 프록시 강의를 보고 궁금한게 생겨 질문드립니다. 먼저 member객체를 생성하고 member.setUserName("hello");로 이름을 설정하고 persist(member); 하시고 바로 flush를 하셨습니다. 이후에 em.getReference(Member.class, member.getId());를 하시고 getId와 getUserName을 하실때 getId는 이미 getReference를 할때 getId(이미 있는 값이라 하셨습니다)를 사용해서 db에서 조회할 일이 없었다 라고 하셨고 getUserName은 db에서 조회해야한다 라고 하셨었는데 처음에 member객체에서 setUserName으로 값을 넣어주었고 id도 generatedValue로 값이 자동으로 설정되어서 2개의 값이 flush하기 전에 세팅이 되었는데 왜 id는 조회할때 이미 있는값이라 select문이 안나가고 userName은 값이 없어 select문이 나간건지 궁금합니다(설명을 잘 못해서 죄송합니다 ㅜ... 이해가 잘 안간탓에... 답변 해주시면 감사하겠습니다)
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
둘다 외래키인 테이블은 서로 JPA로는 조인을 할 수 없나요?
강의에서는 프라이머리 키와 외래키 간의 테이블에서만 조인을 하시는데외래키테이블1과 외래키테이블2인 테이블 끼리는 서로 조인을 할 수 없나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
동일한 PK값을 갖는 서로 다른 Entity를 각각 persist할 경우...
안녕하세요,약간 이상한 질문일 수 있지만 명확히 짚고 넘어가고 싶어 질문 글을 작성합니다.현재 아래와 같이 아주 단순한 Member 엔티티가 있습니다.@Entity(name = "Member") @Table(name = "Member") public class Member { @Id private Long memberId; private String memberName; public Long getMemberId() { return memberId; } public void setMemberId(Long memberId) { this.memberId = memberId; } public String getMemberName() { return memberName; } public void setMemberName(String memberName) { this.memberName = memberName; } } 테스트를 위해 memberId (PK)를 자동 할당하지 않고 직접 할당하였습니다.public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { Member member1 = new Member(); member1.setMemberId(1L); member1.setMemberName("helloJPA"); em.persist(member1); Member member2 = new Member(); member2.setMemberId(1L); member2.setMemberName("helloJPA"); em.persist(member2); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); emf.close(); } } }위 메인 메서드의 실행 순서를 보면,변수이름 member1을 선언하여 PK값(1L)과 setMemberName 메서드를 호출하여 이름을 설정해주고 영속성 컨텍스트에 저장하였습니다.변수이름 member2를 선언하여 PK값(1L)과 setMemberName 메서드를 호출하여 이름을 설정해주고 영속성 컨텍스트에 저장하였습니다.member1 엔티티와 member2 엔티티는 PK값이 동일합니다. 하지만 member1 엔티티가 먼저 영속성 컨텍스트에 저장됐기 때문에 1L의 PK값을 가진 member1 엔티티가 먼저 영속 상태가 됐을 것입니다.개발자의 실수로 인해 member1과 동일한 PK값을 가진 member2 엔티티를 동일한 영속성 컨텍스트에 영속화 시켰습니다.이 부분에서 질문입니다. 위 상황에서 main 메서드를 실행했을 시 먼저 영속화된 member1 엔티티의 Insert 쿼리가 아예 실행되지 않습니다. (어떠한 Insert 쿼리 자체가 실행되지 않습니다.)데이터베이스에는 아무런 데이터가 저장되어 있지 않습니다. Intellij 콘솔을 확인해봐도 오류/경고나 예외가 발생되지 않았습니다.동일한 PK 값을 가진 서로 다른 두 개의 인스턴스(엔티티)를 동일한 영속성 컨텍스트에 저장했을 때 어떤 이유에서 오류나 예외가 발생하지 않고 Insert 쿼리 자체도 실행이 안 되는 것인지 궁금합니다.긴 질문 글 읽어주셔서 감사드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대일에서 조인과 그렇지 않은 상황에서의 속도 차이
안녕하세요 JPA 강좌를 잘 수강하고 있는 와중에 궁금한 점이 생겨서 질문올립니다. 먼저 궁금한 것은 다대일에서 조인입니다. @Entity @AllArgsConstructor @NoArgsConstructor @Getter @Builder public class Category implements Serializable{ @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "category", cascade = CascadeType.PERSIST) private List<Product> products = new ArrayList<>(); public void addProducts(Product product) { products.add(product); product.setCategory(this); } }@Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Product implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer price; @ManyToOne @JoinColumn(name="category_id") private Category category; public void update(Product source) { this.name = source.getName(); this.price = source.getPrice(); } public void setCategory(Category category) { this.category = category; } } 위와 같은 예제 코드 상황에서Product의 입장에서 findById를 하게 되면 @JoinColumn어노테이션이 붙어서 자연스럽게 join한 쿼리가 날라가게 됩니다. 하지만 findByCategoryName 메서드를 실행하면 조인 쿼리가 아니라 select p from Product p where p.category.name = ?1이런 where절 쿼리, 즉 natural join 쿼리가 발생하는데요, JPA에서 자동으로 조인을 하지 않고 기본 SQL순서인from -> where -> select 으로 진행될텐데, select p from Product p left join category c on p.category_id = c.id where c.name = ?1 와 속도 측면에서 얼마나 차이가 나는지 궁금합니다.(레코드 수에 따라 다르겠지만)
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL실행 후 캐시의 엔티티에는 변경사항이 적용이 안 되는 건가요?
[질문 내용]강의를 보다가 의문이 생겨서 질문드립니다!JPQL을 수행하면 자동으로 flush된다고 하셨는데,이 때 캐시의 엔티티는 그대로 보존이 된다면만약에 JPQL이 UPDATE쿼리일 경우 엔티티의 변경 없이 단순 쿼리로만 UPDATE를 수행하고 DB에 반영이 될 경우에는 다시 조회를 해도 캐시에 있는 변경되지 않은 엔티티를 반환하기 때문에 변경된 내용이 적용이 안 되지 않나요?개인적으로 궁금해서 조금 실험해 본 결과로는 JPQL을 통한 데이터 변경 시 flush는 되지만 캐시의 엔티티에 변경사항이 적용되지는 않는 것 같았습니다. 하지만 이렇게 되면, 자신이 변경한 사항을 자신이 볼 수 없는 경우의 수가 생기는 것 아닌가요? 이 부분은 JPA의 특징이라 실제로도 조심해야 하는 부분 중에 하나일까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 내 특정 필드 지연 로딩
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요.지연 로딩 관련하여 문의 드릴 것이 있습니다! 강의에서는 지연 로딩 관련된 내용은 연관 관계에 있는 엔티티를 조회 하는 경우를 주로 다뤄주셨는데,동일한 엔티티 내 특정 필드만 지연 로딩하는 경우는 일반적으로 어떻게 처리하는지 궁금합니다!(엔티티를 추가로 만드는 방법도 생각했는데 지연 로딩을 위해 필드만 별도의 테이블과 엔티티를 만드는게 맞는지 의구심이 듭니다) 참고로, 특정 필드를 지연 로딩을 고려한 이유는 데이터 사이즈가 크고(LOB), 수시로 조회하는 필드가 아니라 그렇습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
<dependency> 오류입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 ㅠㅠ 강의 처음 시작하는데 <dependency> 부분에서 계속 에러가 납니다 메이븐 눌러서 리로드 해봤는데도 계속 똑같더라구요 ..
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
중요한건 아니지만 설계 툴에 관해
안녕하세요. 중요한 질문은 아니지만테이블 설계와 엔티티 설계 할때 쓰시는 툴이 따로 있으신가 해서 질문드립니다.바쁘실텐데 감사합니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
스칼라 타입 프로젝션에서 이해가 안가는게 한가지 있습니다!
안녕하세요 스칼라 타입에서 질문이 있습니다!!!처음에 엔티티, 임베디드 타입, 스칼라 프로젝션을 다 같이 설명하실때 작성하셨던em.createQuery("select m.username, m.age from Member m")이 코드에서 실행하셨을때 스칼라 타입이 딱히 문제 없이 실행된 것 같은데 이건 조회를 하는 코드가 아닌가요....?다른 엔티티나 임베디드 타입은 그냥 저런 식으로 작성해서 조회가 된다고 하셨고 실행하셨을 때, 문제가 없는 것처럼 말씀을 하셨고스칼라 타입도 처음에 저렇게 실행을 하셨을 때, 결과 창이 비슷하게 나와서 저는 저게 조회하는 코드인 줄 알았는데 뒤에 바로 고민거리가 생긴다고 하시고 DTO을 생성한 뒤, new operation을 사용해서 코드를 작성하셔서 이렇게 조회를 해야된다고 하셨는데Q1. 그럼 제가 위에서 적은 조회하는 코드라고 생각했던 것은 왜 크게 오류가 안나고 실행이 된건가요....?Q2. 그리고 MemberDTO자리에 그냥 Member 엔티티로 대신 사용해도 문제 없이 실행이 되던데 DTO를 사용하는 이유는 중요 역할을 하는 엔티티를 반환하는 것이 설계상 안 좋아서 DTO를 따로 만드신 건가요???
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의를 쭉 듣다가 생긴 기본적인 질문입니다.
안녕하세요 다름이 아니라 강의들을 쭉 듣다보니앞에 @Enumerated 어노테이션을 설명하실때도EnumType.ORDINAL이 순서를 DB에 저장하는 것이라 실무에서 쓰지 말라고 하셨고이번에 JPQL에서도 파라미터 바인딩에서 위치 기준으로 바인딩하는건 쓰지말라고 하셨는데(이것도 순서를 기준으로 하는 것이니까 그런 것이겠죠??)Q. 실무에서 Spring이나 JPA뿐만이 아니라 다른 기술들을 쓰더라도 웬만한 상황들에 대해서 순서를 기준으로 데이터를 저장하거나 조회한다거나 이런 코드들은 데이터의 변화에 따라서 순서가 바뀔 수 있으므로 안쓰는 것이 좋은 가요?!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 실습 세팅하는데 오류 문제 어떻게 방법이 없을까요?
김영한님 좋은 강의 감사합니다. 다름이 아니라 제가 열심히 교육 드는데,초보자라 아직 모르게 좀 많습니다. 특히 실습환경 구축 시 오류가 뜨는 경우가 제법 있는데,아무리 검토하고 복붙을 활용해도 안되는 케이스가 있던데, 이게 노트북OS마다 다르겠지만, 적어도 실습할 수 있는 환경파일이나 최근에 촬영한 실습환경 구축 영상이라도 번외로 제공해주시면 오류 문제들이 최소화될 것 같습니다. 감사합니다 :)
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대일 양방향에 대한 정리와 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래는 제가 강의를 듣고 직접 변형 코드를 작성하면서 정리한 내용입니다.강의 중 member - team의 관계가 comment - team 으로 변경 되었다고 생각하시면 되겠습니다.제일 아래에 제 질문이 있습니다. 요약하자면, findByXXX 등으로 다대일 단방향 관계에서도 원활하게 데이터를 가져올 수 있는 것 같은데, 굳이 양방향을 사용하는 이유는 객체 지향적으로 코드를 짜기 위함인지, SQL 등에서 이점이 있는 지에 대해 궁금합니다.양방향 연관관계가 필요한가?댓글 같은 경우는 commentRepository에서 findByWriter로 가져오는 게 효율적인가? 아니면 Post 엔티티에서 comments에 대한 List 연관관계를 설정하고 가져오는 게 효율적인가?편한 건 post.getComments 로 가져오나, commentsService.findByWriter(Post post) 를 호출시켜서 가져오나 비슷한 것 같다.그런데 전자로 할 땐 account와 post 에만 select 문이 나가고, 후자로 할 땐 comments에 대한 select 문이 추가로 나간다.좋아요같은 경우는 자주 조회되니 post.getComments를 해두는 게 좋은건가?아래와 같은 연관관계 편의 메소드는 왜 필요할까?public void setPost(Post post) { this.post = post; post.getComments().add(this); } 어차피 em.persist(comment)에서 외래 키 값을 comment의 post에서 꺼내서 넣으면서 DB에 반영이 되며, JPA에서 실제 Post의 데이터를 사용하는 시점에 쿼리를 날린다. (지연로딩) 그래서 값을 세팅해주지 않아도 값이 출력이 된다.그러나 객체지향적으로 생각해보면 양쪽 다 값을 입력하는 것이 맞다.또한 post.getComments().add(this); 를 넣어주지 않으면 2군데서 문제가 생긴다.em.flush와 em.clear를 하지 않는 상황flush와 clear를 하면 1차 캐시에 아무것도 없으므로 DB에서 다시 조회해온다. 그래서 JPA가 FK가 있다는 것도 알고, 매커니즘이 동작한다.em.find해서 post을 가져올 때, 해당 post은 영속 컨텍스트의 1차 캐시에 있다. 위에 코드에서 세팅된 값 그대로 메모리에 올라가 있다.comments 컬렉션에 값이 있을까? 없다. 순수한 객체 상태이다.테스트 케이스 작성테스트 케이스를 작성할 때는 JPA 없이도 동작하도록 순수한 자바 단위로 테스트를 작성한다. 이때, 에러가 발생한다.양방향 연관관계 주의사항순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자.JPA에서의 설계는, 단방향 매핑만으로도 이미 연관관계 매핑은 완료테이블과 객체를 매핑한다는 관점에서만 보면, 단방향만으로도 설계가 완료된다.양방향 매핑은 반대방향으로 조회(객체 그래프 탐색) 기능이 추가된 것 뿐객체 입장에서는 양방향으로 설계해서 좋을 게 없다. 연관관계 편의 메서드 등 고민거리만 많아진다.그러나 실무에선, JPQL에서 역방향으로 탐색할 일이 많다. 그때 양방향으로 하면 된다.단방향 매핑을 잘하고 양방향은 필요할 때 추가해도 됨. (테이블에 영향을 주지 않음. 그냥 반대방향에서 컬렉션만 추가된 것.)즉, 설계할 때는 단방향 매핑만으로만 설계하고, 개발에 들어가서 양방향을 고민해도 늦지 않다. 객체 입장에서는 양방향 매핑에 대한 이득이 없다. 필요하다면 연관관계 편의 메서드로 양방향을 설정해주자.질문JPQL에서 역방향으로 탐색할 일이 많을 때 양방향으로 설정해야 하는 이유는 뭐지?코드를 객체지향적으로 짜기 위함인가, 아니면 SQL 쿼리에서 이점을 얻을 수 있는 건가?만약 둘 중 하나를 선택한다면, 나머지 하나는 없어도 되는 건가?양방향 연관관계 설정하고 post.comments로 JpaRepository의 findByWriter 역할을 대체한다면, findByWriter는 없어도 되는건가?영속 컨텍스트 1차 캐시에 없는 상태에서 post.getComments()로 가져올 때, Comment 에 대한 SQL에 select 문이 나가지 않는 이유는? 영속 컨텍스트 1차 캐시에 없는 상태에서 post.getComments()로 가져올 때, Comment 에 대한 SQL에 select 문이 나가지 않는 이유는?// Comment Select문 실행됨. @Transactional(readOnly = true) public List<Comment> findByPost(Long postId) { Post post = postService.findById(postId); return commentRepository.findByPost(post); } // 연관관계 편의 메소드를 사용한 코드 // Comment Select문 실행되지 않음. 값은 정상적으로 출력됨. @Transactional(readOnly = true) public List<Comment> findByPostObj(Long postId) { Post post = postService.findById(postId); List<Comment> commentList = post.getCommentList(); log.info("post.getCommentList = {}", commentList); return commentList; }
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
em.remove() 메소드 관련 질문 드립니다.
em.remove() 메소드를 실행했을 때, 영속 컨텍스트 내부에 등록되어 있는 캐시가 삭제되는 건가요?제가 이해한게 맞는지 모르겠습니다.1) em.find()를 실행해서 엔티티가 영속 컨텍스트 내부 캐시에 등록되어 있지 않을 경우, DB를 조회해서 객체를 영속 컨텍스트에 저장2) em.remove()를 실행했을 때, 캐시에 등록되어 있던 엔티티가 삭제하고 delete 쿼리문을 쓰기 지연 SQL 저장소에 저장3) 커밋이 실행되면 delete 쿼리문을 실행답변 부탁드리겠습니다!