2013-02-06 3 views
10

테이블이 2 개만 있습니다. 테이블에는이 두 필드로 구성된 복합 PK가 있습니다.2 개의 기본 키 필드가있는 JPA 테이블

데이터베이스에서 엔티티 bean을 작성하기 위해 Netbeans를 사용할 때 엔티티 bean은 2 개 이상의 필드가있는 다른 테이블처럼 자동으로 작성되지 않습니다.

그래서 엔터티 빈을 직접 만들어야한다고 생각합니다. 이 엔티티 bean을 생성하는 가장 좋은 방법은 무엇입니까? COMPOSITE KEY 오브젝트를 포함해야합니까?

+0

@Xavi López : 그들은 PK를 함께 보존합니다. – user2046810

답변

27

NetBeans를 사용하지 않으므로 매핑 도구에 관해서는 정말 말할 수 없습니다.

복합 키를 매핑하는 데는 두 가지 옵션이 있습니다. 당신은

  • 는 PK 필드로 별도의 @Embeddable 객체를 정의하고

    @Embeddable 
    public class MyCompositePK { 
        @Column 
        private String fieldA; 
        @Column 
        private String fieldB; 
    } 
    @Entity 
    public class MyBean { 
        @EmbeddedId 
        private MyCompositePK id; 
        @Column 
        private String fieldC; 
    } 
    
  • 는 PK 필드와 매핑되지 않은 POJO를 정의하고 @IdClass로 사용하여 @Entity 클래스에서 @EmbeddedId로 사용할 수 있습니다 @Entity에 있습니다. 이 예에서는 ClassABId

    @Entity 
    @IdClass(value=ClassAB.ClassABId.class) 
    public class ClassAB implements Serializable { 
        private String idA; 
        private String idB; 
    
        @Id 
        @Column(name="ID_A") 
        public String getIdA(){ return idA; } 
        public void setIdA(String idA){ this.idA = idA; } 
    
        @Id 
        @Column(name="ID_B") 
        public String getIdB(){ return idB; } 
        public void setIdB(String idB){ this.idB = idB; } 
    
        static class ClassABId implements Serializable { 
         private String idA; 
         private String idB; 
    
         public String getIdA(){ return idA; } 
         public void setIdA(String idA){ this.idA = idA; } 
    
         public String getIdB(){ return idB; } 
         public void setIdB(String idB){ this.idB = idB; } 
    
         // implement equals(), hashcode() 
        } 
    } 
    

    단지 편의를위한 정적 내부 클래스이다.

이러한 옵션은이 질문에 대한 Pascal Thivent의 탁월한 대답 인 How to map a composite key with Hibernate?에도 설명되어 있습니다.

이 관련 질문은 이러한 접근 방식의 차이점을 설명합니다. Which anotation should I use: @IdClass or @EmbeddedId. 필드의 선언은 @IdClass 접근법과 중복됩니다.

아무튼, 나는 두 개의 클래스를 만드는 것에 대한 대안이 없다고 생각합니다. 그래서 나는이 질문을했습니다 : Mapping a class that consists only of a composite PK without @IdClass or @EmbeddedId. 그것에 대한 최대 절전 모드 특정 기능이있는 것 같습니다.

DB 구조를 제어 할 수 있다면 복합 키를 피할 수도 있습니다. There are some reasons to do so.

+2

개체가 두 개의 기본 키 필드 만 포함하면 자체 IdClass 일 수 있습니까? –

+1

@TomAnderson 재미 있어요. 나는 한번도 시도한 적이 없다. [아무도하지 않은 것 같습니다] (https://forum.hibernate.org/viewtopic.php?p=2419264) 성공하지 못했습니다.사양은 이것에 발음하지 않는 것 같습니다. 구현에 따라 달라질 수 있습니다. –

+1

@TomAnderson : ID 클래스는 복합 키 값을 기반으로하는 equals() 메소드를 구현해야하기 때문에 그렇게 생각하지 않습니다. –

0

감사합니다. @ XaviLópez. 귀하의 설명은 @Tom Anderson에 의해 언급 된 자체 IdClass로 선언 된 코드를 수정했습니다. @Id 열이있는 자체 IdClass로 선언하면 해당 엔티티의 목록을 가져 오는 JPA 쿼리가 결과 목록의 예상 "n"항목을 반환했지만 해당 목록의 각 항목은 null입니다. 그러나 그 크기 "n"은 예상됩니다. 리팩터링이 적은 정적 인 내부 클래스로 변경 한 후에는 올바른 결과 집합을 반환 할 수 있습니다.

자기 소개에 따르면 자기 참조 IdClass는 실체가 이미 엔티티이고 지속성 컨텍스트에 있어야하기 때문에 작동하지 않습니다. 동일한 유형의 기본 키 객체가있는 경우에는 지속성 컨텍스트에 두 개의 "동일한"객체가 있습니다. 따라서, 허용해서는 안됩니다. 따라서 우리는 @IdClass를 참조하는 자체를 사용해서는 안됩니다. 덜 내부적 인 기본 키 유형으로 정적 내부 클래스를 작성하십시오.