@OneToMany와 @ElementCollection의 차이점은 무엇입니까?


130

둘 다 일대 다 관계에서 작동하므로 a @OneToMany@ElementCollection주석을 사용하는 것의 차이점은 무엇입니까 ?


3
요컨대, @ElementCollection은 부모 엔티티가 없으면 자식 엔티티의 존재가 무의미 할 때 사용됩니다. IOW, 부모 엔티티가 제거 될 때마다 자식도 ...
dellasavia

1
나는 그것이 자식 엔터티가 아니라, 그것이 포함 된 주요 엔터티 없이는 그 존재가 의미가 적은 값 유형 / 값 객체라고 믿는다.
CuriousMind dec.

@CuriousMind에 동의하고 JPA에서 '엔티티'는 자체 수명주기를 가지고 있습니다.
mhrsalehi

답변:


125

나는 @ElementCollection주로 엔티티를 매핑하는 @OneToMany데 사용되는 동안 비 엔티티 (포함 가능 또는 기본) 매핑을위한 것이라고 생각 합니다. 따라서 사용할 것은 달성하려는 것에 따라 다릅니다.


1
대답 해 주신 Peder에게 감사드립니다! @OneToMany는 엔터티 만 관련시킬 수 있으므로 유효한 지점이 있습니다.
n_g

157

ElementCollection표준 JPA 주석으로, 이제 독점적 인 Hibernate 주석보다 선호됩니다 CollectionOfElements.

이는 컬렉션이 엔터티 컬렉션이 아니라 단순 유형 (문자열 등)의 컬렉션 또는 포함 가능한 요소의 컬렉션 (으로 주석이 달린 클래스)임을 의미 @Embeddable합니다.

또한 요소가 포함 된 엔터티가 완전히 소유하고 있음을 의미합니다. 엔터티가 수정되면 수정되고, 엔터티가 삭제되면 삭제됩니다. 자체 수명주기를 가질 수 없습니다.


... 자체적으로 쿼리 할 수 ​​없습니다.
스턱

67

@ElementCollection단순 또는 포함 된 유형으로 일대 다 관계를 구현하려는 경우 코드를 단순화 할 수 있습니다. 예를 들어 JPA 1.0에서의 목록에 대해 일대 다 관계를 원할 때 기본 키와 해당 항목 만 포함 String하는 간단한 엔터티 POJO ( StringWrapper) 를 만들어야했습니다 String.

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

JPA 2.0을 사용하면 다음과 같이 간단히 작성할 수 있습니다.

@ElementCollection
private Collection<String> strings;

더 간단하지 않습니까? @CollectionTable주석을 사용하여 테이블 및 열 이름을 계속 제어 할 수 있습니다 .

또한보십시오:


추론에 대한 훌륭한 설명. :)
Phuah Yee Keat

4

기본 또는 포함 : @ElementCollection
엔터티 : @OneToMany 또는 @ManyToMany

@ElementCollection :

  • 관계가 정의 된 엔티티에 의해서만 관리됩니다.
  • 테이블에는 소유 엔티티에 대한 ID 참조와 기본 또는 포함 된 속성이 포함됩니다.

@OneToMany / @ManyToMany :

  • 다른 엔티티에서 관리 할 수도 있습니다.
  • 조인 테이블 또는 열은 일반적으로 ID 참조 만 포함합니다.

1

@ElementCollection컬렉션을 표시합니다. 이것은 반드시이 컬렉션이 1-n 조인을 참조한다는 것을 의미하지는 않습니다.


1
그렇다면 @ElementCollection의 목적은 정확히 무엇입니까?
n_g

0

ElementCollection은 해당 컬렉션에 대한 매핑 또는 테이블을 재정의 할 수 있으므로 여러 엔터티가 동일한 Embeddable 클래스를 참조하도록 할 수 있지만 각각 별도의 테이블에 종속 개체를 저장하도록 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.