// 등록 및 검색
...
transaction.begin();
try {
// Hotel 등록
Address address = new Address("주소1", "주소2", "12345");
Hotel hotel = new Hotel("H00", "HN", 2022, address);
entityManager.persist(hotel);
entityManager.flush();
entityManager.clear();
// Hotel 검색
Hotel foundHotel = entityManager.find(Hotel.class, "H00");
System.out.println(foundHotel.getAddress());
transaction.commit();
}
...
@Embeddable 사용하면 데이터베이스에 저장할 때는 하나의 테이블에 저장이 됩니다.
데이터 조회하는 경우에는 Address 객체에 주소 정보를 담아서 Hotel 엔티티 객체에 담아줍니다.
INSERT 쿼리 실행SELECT 쿼리 실행h2database에 저장된 데이터 조회
Hotel 정보 저장 시 Address가 null인 경우에는 해당 컬럼에 null 값이 저장됩니다.
Address 객체가 null인 경우 INSERT 결과
같은 @Embeddable 타입 필드가 두 개인 경우
// Address 타입 필드가 두개인 경우
@Entity
public class Employee {
@Id
private String id;
@Embedded private Address homeAddress;
@Embedded private Address workAddress;
}
같은 @Embeddable 타입 필드가 존재하는 경우 같은 컬럼이 매핑되어 에러가 발생합니다. (Repeated column in mapping for entity: ...)
그래서 @AttributeOverride 어노테이션을 설정해주어 다른 컬럼을 매핑할 수 있도록 해줍니다.