source

@IdClass 또는 @EmbeddedId 중 어떤 주석을 사용해야 합니까?

nicesource 2022. 12. 4. 22:29
반응형

@IdClass 또는 @EmbeddedId 중 어떤 주석을 사용해야 합니까?

JPA(Java Persistence API) 사양에는 엔티티 복합 키를 지정하는 방법이2가지 있습니다.@IdClass그리고.@EmbeddedId.

매핑된 엔티티에서 두 개의 주석을 사용하고 있지만 잘 모르는 사람들에게는 큰 혼란이 될 수 있습니다.JPA.

복합 키를 지정하는 방법은 한 가지뿐입니다.어떤 게 정말 최고인가요? 왜요?

라고 생각합니다.@EmbeddedId아마 더 장황할 것이다 왜냐하면@IdClass필드 액세스 오퍼레이터를 사용하여 프라이머리 키 오브젝트 전체에 액세스 할 수 없습니다.사용방법@EmbeddedId다음과 같이 할 수 있습니다.

@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
  @EmbeddedId EmployeeId employeeId;
  ...
}

복합키를 만드는 필드는 필드 액세스오퍼레이터를 통해 액세스되는 클래스로 모두 집약되기 때문에 이를 통해 명확하게 이해할 수 있습니다.

와의 또 다른 차이점@IdClass그리고.@EmbeddedIdHQL을 쓰는 경우:

와 함께@IdClass다음과 같이 씁니다.

종업원 e에서 e.name을 선택합니다.

그리고@EmbeddedId다음과 같이 적어야 합니다.

종업원 e에서 e.employeeId.name을 선택합니다.

동일한 쿼리에 대해 더 많은 텍스트를 작성해야 합니다.어떤 사람들은 이것이 에 의해 촉진된 것과 같은 보다 자연스러운 언어와는 다르다고 주장할 수 있다.IdClass그러나 대부분의 경우 쿼리에서 특정 필드가 복합 키의 일부라는 것을 이해하는 것이 매우 유용합니다.

복합 프라이머리 키를 사용하는 방법에는 다음 3가지가 있습니다.

  • 로 표시하다@Embeddable엔티티 클래스에 일반 속성을 추가합니다.@Id.
  • 엔티티 클래스에 일반 속성을 추가합니다.@EmbeddedId.
  • 모든 필드의 엔티티 클래스에 속성을 추가하고 다음 항목으로 표시합니다.@Id엔티티 클래스에 마크를 붙입니다.@IdClass프라이머리 키클래스의 클래스를 지정합니다.

의 사용@Id라고 마크된 클래스로@Embeddable가장 자연스러운 접근법입니다.@Embeddable태그는 프라이머리 키 이외의 삽입 가능 값에 사용할 수 있습니다.복합 프라이머리 키를 단일 속성으로 취급할 수 있습니다.또, 이 기능을 사용하면, 이 키를 재이용할 수 있습니다.@Embeddable다른 테이블의 클래스

다음으로 가장 자연스러운 접근법은 RSA의@EmbeddedId여기서 프라이머리 키클래스는 다른 테이블에서 사용할 수 없습니다. 왜냐하면 프라이머리 키클래스는@Embeddable엔티티에서는 키를 특정 클래스의 단일 속성으로 취급할 수 있습니다.

마지막으로 의 용도는@IdClass그리고.@Id주석을 사용하면 기본 키 클래스의 속성 이름에 해당하는 엔티티 자체의 속성을 사용하여 복합 기본 키 클래스를 매핑할 수 있습니다.이름은 일치해야 합니다(이를 덮어쓰는 메커니즘은 없습니다).프라이머리 키클래스는 다른 2개의 테크닉과 같은 의무를 따라야 합니다.이 접근방식의 유일한 장점은 프라이머리 키클래스의 사용을 주변 엔티티의 인터페이스로부터 「숨김」할 수 있는 것입니다.@IdClass주석은 클래스 유형의 값 매개 변수를 사용합니다. 이 매개 변수는 복합 기본 키로 사용할 클래스여야 합니다.사용하는 프라이머리 키클래스의 속성에 대응하는 필드에는 모두 주석을 달아야 합니다.

참고 자료: http://www.apress.com/us/book/9781430228509

IdClass 대신 EmbeddedId를 사용해야 하는 인스턴스를 발견했습니다.이 시나리오에서는 추가 열이 정의된 조인 테이블이 있습니다.IdClass를 사용하여 조인 테이블 내의 행을 명시적으로 나타내는 엔티티의 키를 나타내려고 했습니다.이런 식으로 작동시킬 수가 없었어요.다행히 "Java Persistence With Hibernate"에는 이 항목 전용 섹션이 있습니다.제안된 솔루션 중 하나는 제 솔루션과 매우 유사하지만 EmbeddedId를 대신 사용했습니다.나는 책 속의 사물들을 본떠서 내 사물들이 이제 올바르게 동작한다.

로는 복합 FK가 PK FK를 사용하는 이 더 .@IdClass

★★★★★★★★★★★★★★★★ @EmbeddedId에 대한 을 FK에 한 번 두 번 .@Embeddedable★★★★★★★★★★★★★... @ManyToOne서 ''는@ManyToOne전용이어야 .@PrimaryKeyJoinColumn두 변수에 하나의 열을 설정할 수 없기 때문입니다(예: 충돌).
에 FK의 간단한 해서 FK를 .@Embeddedable.

on른른른른른 using using using using using using를 사용하여 다른 사이트에서@IdClass이 상황은 일대일 및 다대일 관계를 통한 프라이머리 키에서 볼 수 있듯이 훨씬 쉽게 처리할 수 있습니다.

예: JPA 2.0 ManyToOne ID 주석

...
@Entity
@IdClass(PhonePK.class)
public class Phone {
 
    @Id
    private String type;
 
    @ManyToOne
    @Id
    @JoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID")
    private Employee owner;
    ...
}

JPA 2.0 ID 클래스의 예

...
public class PhonePK {
    private String type;
    private long owner;
 
    public PhonePK() {}
 
    public PhonePK(String type, long owner) {
        this.type = type;
        this.owner = owner;
    }
 
    public boolean equals(Object object) {
        if (object instanceof PhonePK) {
            PhonePK pk = (PhonePK)object;
            return type.equals(pk.type) && owner == pk.owner;
        } else {
            return false;
        }
    }
 
    public int hashCode() {
        return type.hashCode() + owner;
    }
}

제 생각에 가장 큰 장점은 우리가 이 모든 것들을@GeneratedValue, 「ID」를 사용하는 @IdClass우리는 분명히 사용할 수 없습니다.@GeneratedValue★★★★★★에@EmbeddedId.

복합 키에는 다음을 포함할 수 없습니다.@Id의 경우 @EmbeddedId용됩니니다다

EmbeddedId를 하면 HQL에서할 수 EmbeddedId " " " " " " " " HQL " IN " " " " ) 。FROM Entity WHERE id IN :ids에서 동일한 IdClass는 "Id" "EmbeddedId" "IdClass" "IdClass" "IdClass" "IdClass" "Id" "Id" "Id" "Id" "Id" "Id" "Id" "Id"와 같은 작업을 수행합니다.FROM Entity WHERE idPartA = :idPartA0 AND idPartB = :idPartB0 .... OR idPartA = :idPartAN AND idPartB = :idPartBN

언급URL : https://stackoverflow.com/questions/212350/which-annotation-should-i-use-idclass-or-embeddedid

반응형