@Entity public class Employee { @Id @Column(name="EMP_ID") private long id; ... @ElementCollection @CollectionTable( name="PHONE", joinColumns=@JoinColumn(name="OWNER_ID") ) private List<Phone> phones; ... }
builder.like( root.<MyEntity, String, String>joinMap("properties").value(), "example%");
builder.like(root.join(Entity_.elementCollection), '%keyword%'))
@ElementCollection
을 통해 값을 추가할 경우, JPA 구현체는 해당 컬렉션의 모든 데이터를 삭제하고 다시 모든 데이터를 추가한다. PK가 존재하지 않기 때문에 발생하는 현상이다.@OrderColumn
을 사용하면 된다.@ElementCollection
의 fetch 속성을 EAGER로 설정했으면 Hibernate에서 제공하는 @Fetch로 긁어올 방식을 설정해 주어야 한다. → JPA - Hibernate Specific WTF Rules → 해보니깐 @Fetch 안해도 괜찮은데?? 오히려 @Fetch가 안먹는 듯하다.@ElementCollection
으로 @Embeddable
을 저장할 경우 관계 Key가 되는 값이 부모의 PK가 아닌 다른 컬럼이어도 작동은 한다. 하지만 부모의 컬렉션을 로딩한 상태에서 자식들을 로딩하면 각 부모 객체가 동일한 관계 Key를 가지고 있을 경우 별다른 오류 메시지 없이 오류로 간주하고 rollback이 된다. → 따라서 @ElementCollection
의 관계 Key는 부모의 PK나 혹은 PK에 준하는 각 부모별로 동일한 값이 나올 수 없는 것으로 지정해야 한다.