사용자 도구

사이트 도구


java:jpa:elementcollection

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:jpa:elementcollection [2014/09/24 13:05]
kwon37xi [주의점]
java:jpa:elementcollection [2015/01/13 10:48]
kwon37xi [@ElementCollection에 조건 주기]
줄 1: 줄 1:
 ====== JPA @ElementCollection ====== ====== JPA @ElementCollection ======
 +
 +  * [[http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection|JPA ElementCollection]]
 +
 +===== 기본 =====
 +  * Parent<code java>
 +@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;
 +  ...
 +}
 +</code>
 +  * Children<code java>
 +@Embeddable
 +public class Phone {
 +  private String type;
 +  private String areaCode;
 +  @Column(name="P_NUMBER")
 +  private String number;
 +  ...
 +}
 +</code>
 +
 +
  
 ===== @ElementCollection에 조건 주기 ===== ===== @ElementCollection에 조건 주기 =====
줄 9: 줄 41:
     builder.like(root.join(Entity_.elementCollection), '%keyword%'))     builder.like(root.join(Entity_.elementCollection), '%keyword%'))
 </code> </code>
 +
 +===== 값 추가시 전체 삭제후 재추가하는 문제 =====
 +  * ''@ElementCollection''을 통해 값을 추가할 경우, JPA 구현체는 해당 컬렉션의 모든 데이터를 삭제하고 다시 모든 데이터를 추가한다. PK가 존재하지 않기 때문에 발생하는 현상이다.
 +  * 이 현상을 조금이나마 줄이려면 ''@OrderColumn''을 사용하면 된다.
 +  * [[http://stackoverflow.com/questions/3742897/hibernate-elementcollection-strange-delete-insert-behavior|java - Hibernate - @ElementCollection - Strange delete/insert behavior]]
  
 ===== 주의점 ===== ===== 주의점 =====
   * ''@ElementCollection''의 fetch 속성을 EAGER로 설정했으면 Hibernate에서 제공하는 @Fetch로 긁어올 방식을 설정해 주어야 한다. -> [[http://divinespear.blogspot.kr/2014/03/jpa-hibernate-wtf-specific.html|JPA - Hibernate Specific WTF Rules]] -> 해보니깐 @Fetch 안해도 괜찮은데?? 오히려 @Fetch가 안먹는 듯하다.   * ''@ElementCollection''의 fetch 속성을 EAGER로 설정했으면 Hibernate에서 제공하는 @Fetch로 긁어올 방식을 설정해 주어야 한다. -> [[http://divinespear.blogspot.kr/2014/03/jpa-hibernate-wtf-specific.html|JPA - Hibernate Specific WTF Rules]] -> 해보니깐 @Fetch 안해도 괜찮은데?? 오히려 @Fetch가 안먹는 듯하다.
   * ''@ElementCollection''으로 ''@Embeddable''을 저장할 경우 관계 Key가 되는 값이 부모의 PK가 아닌 다른 컬럼이어도 작동은 한다. 하지만 부모의 컬렉션을 로딩한 상태에서 자식들을 로딩하면 각 부모 객체가 동일한 관계 Key를 가지고 있을 경우 별다른 오류 메시지 없이 오류로 간주하고 rollback이 된다. -> **따라서 ''@ElementCollection''의 관계 Key는 부모의 PK나 혹은 PK에 준하는 각 부모별로 동일한 값이 나올 수 없는 것으로 지정해야 한다.**   * ''@ElementCollection''으로 ''@Embeddable''을 저장할 경우 관계 Key가 되는 값이 부모의 PK가 아닌 다른 컬럼이어도 작동은 한다. 하지만 부모의 컬렉션을 로딩한 상태에서 자식들을 로딩하면 각 부모 객체가 동일한 관계 Key를 가지고 있을 경우 별다른 오류 메시지 없이 오류로 간주하고 rollback이 된다. -> **따라서 ''@ElementCollection''의 관계 Key는 부모의 PK나 혹은 PK에 준하는 각 부모별로 동일한 값이 나올 수 없는 것으로 지정해야 한다.**
java/jpa/elementcollection.txt · 마지막으로 수정됨: 2015/01/13 10:48 저자 kwon37xi