임베디드 값타입을 공유하는 두 객체가 있다. 한 객체에서 임베디드 값타입을 수정하면 이를 공유하는 다른 객체의 임베디드 값타임도 수정된다. 이는 자바에서 참조값을 수정하면 이를 참조하는 모든 객체의 값이 바뀌는 것과 동일한 원리이다. 근데 막상 임베디드 타입을 수정하니 한 객체에서만 수정되는 상황이 발생했다. 분명 공부할 때는 이를 공유하는 모든 객체의 임베디드 타입이 수정된다고 배웠는데 왜 한 객체만 수정되는 걸까? 그 이유는 ORM을 잘못 이해하고 사용했기 때문이었다. Member 엔티티 다른 필드들은 볼 필요없이 homeAddress 필드에만 집중하면 된다. @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") p..
Embedded 값 타입을 다루고 있는데 오류가 발생했다. javax.persistence.RollbackException: Error while committing the transaction at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104) at jpay.jpastudy.JpastudyApplication.main(JpastudyApplication.java:44) Caused by: java.lang..
DB에서 특정 엔티티를 조회하면 연관관계에 있는 엔티티 또한 같이 조회됩니다. 연관관계에 있는 엔티티도 조회하기 위해서는 DB에 join과 함께 쿼리문이 나가게 됩니다. 특정 상황에서는 굳이 연관관계에 있는 엔티티가 필요로 없는 상황이 있을 수도 있습니다. 이때 연관관계에 있는 엔티티까지 DB에서 조회하는 것은 효율적이지 않습니다. JPA는 이런 문제를 해결하기 위해 엔티티가 실제 사용될 때까지 DB에서 조회를 지연시키는 방법을 제공합니다. 이를 지연로딩이라고 합니다. 기존 조회 - 연관관계에 있는 엔티티까지 조회 EntityManager의 find() 메서드를 사용하여 엔티티를 조회합니다. clear()로 인해 영속성 컨텍스트가 초기화되었으므로 DB로부터 엔티티를 조회해서 1차 캐시에 저장합니다. 출력..
자바에서는 부모 클래스와 하위 클래스로 이루어진 상속 관계가 존재합니다. 그러나 RDB에서는 상속 관계가 존재하지 않습니다. RDB에서는 슈퍼 타입과 서브 타입 관계가 존재하는데, 이 모델링 기법이 상속 관계와 유사합니다. ORM에서 슈퍼 타입과 서브 타입을 어떻게 다루는지 알아봅시다. 상속관계 매핑 ORM에서 슈퍼 타입과 서브 타입 관계를 다루기 위해 다음 3가지 전략이 존재합니다. 조인 전략 단일 테이블 전략 구현 클래스마다 테이블 전략 이러한 전략을 사용하기 위해서는 @Inheritance 애너테이션을 사용해야 합니다. @Inheritance의 기본 전략은 단일 테이블 전략입니다. 조인 전략 Album, Movie, Book 엔티티는 id, name, price 필드가 공통적으로 사용됩니다. 따라서..
JPA에서는 ORM(Object-Relation Mapping)을 사용합니다. SQL을 통해서 DB에 접근하는 것이 아니라, 객체와 DB의 테이블을 Mapping 하여 데이터를 다룹니다. 객체와 테이블을 Mapping 하기 때문에 연관관계라는 것이 등장하게 됩니다. 연관관계란 객체와 테이블의 외래키(Foreign Key)를 연결해주는 것을 의미합니다. 연관관계를 맺어줌으로써 객체를 통해 DB의 테이블에 접근할 수 있는 것이죠. 단방향 연관관계 단방향 연관관계란 이름에서도 알 수 있듯이, 한 개의 방향으로만 연관관계가 맺어져 있음을 의미합니다. 한쪽 방향으로만 연관관계가 맺어져 있다면 A -> B로 조회가 가능하지만, B -> A로의 조회는 불가능합니다. Member 엔티티 회원은 하나의 팀에 소속할 수 ..