2014-11-20 9 views
1

연락처 엔티티는 두 개의 MySQL 테이블에 존재하는 전자 메일 및 닉네임 엔티티의 두 콜렉션에 대한 관계를 정의합니다.JPA 엔티티가 두 개 이상의 콜렉션을 사용하여 결과 집합을 복사합니다.

제 문제는이 결과 집합에 이메일과 닉네임이 중복되어 있다는 것입니다.

{ 
    "contactId": 1, 
    "givenName": "toast", 
    "middleName": "brown", 
    "familyName": "jam", 
    "dob": "2014-11-19", 
    "contactEmailAddress": [ 
    { 
     "emailAddressId": 1, 
     "emailAddress": "[email protected]", 
     "contactId": 1 
    }, 
    { 
     "emailAddressId": 1, 
     "emailAddress": "[email protected]", 
     "contactId": 1 
    }, 
    { 
     "emailAddressId": 2, 
     "emailAddress": "[email protected]", 
     "contactId": 1 
    }, 
    { 
     "emailAddressId": 2, 
     "emailAddress": "[email protected]", 
     "contactId": 1 
    } 
    ], 
    "contactNickname": [ 
    { 
     "contactNicknameId": 1, 
     "nickname": "mm", 
     "contactId": 1 
    }, 
    { 
     "contactNicknameId": 2, 
     "nickname": "mouse", 
     "contactId": 1 
    }, 
    { 
     "contactNicknameId": 1, 
     "nickname": "mm", 
     "contactId": 1 
    }, 
    { 
     "contactNicknameId": 2, 
     "nickname": "mouse", 
     "contactId": 1 
    } 
    ] 
} 

연락처 엔터티에서 ContactNickname 컬렉션을 제거하면 결과 집합은 다음과 같습니다.

{ 
    "contactId": 1, 
    "givenName": "toast", 
    "middleName": "brown", 
    "familyName": "jam", 
    "dob": "2014-11-19", 
    "contactEmailAddress": [ 
    { 
     "emailAddressId": 1, 
     "emailAddress": "[email protected]", 
     "contactId": 1 
    }, 
    { 
     "emailAddressId": 2, 
     "emailAddress": "[email protected]", 
     "contactId": 1 
    } 
    ] 
} 

고유 한 전자 메일 주소 모음과 고유 한 닉네임 모음이 예상되었지만 사실이 아닙니다. 내가 뭘 잘못하고있어.

JPA를 사용하여 다음과 같이 클래스를 매핑했습니다.

@Entity 
@Table(name="contact_nickname") 
public class ContactNickname implements Serializable { 
    @Id 
    @GeneratedValue 
    @Column(name="contact_nickname_id") 
    private int contactNicknameId; 

    @Column(name="nickname") 
    private String nickname; 

    @Column(name="contact_id") 
    private int contactId; 

    public int getContactNicknameId(){ 
     return contactNicknameId; 
    } 

    public void setContactNicknameId(final int contactNicknameId){ 
     this.contactNicknameId=contactNicknameId; 
    } 

    public String getNickname(){ 
     return this.nickname; 
    } 

    public void setNickname(String nickname){ 
     this.nickname=nickname; 
    }  

    public void setContactId(int contactId){ 
     this.contactId=contactId; 
    } 

    public int getContactId(){ 
     return this.contactId; 
    } 
} 

@Entity 
@Table(name="contact_email_address") 
public class ContactEmailAddress implements Serializable { 
    @Id 
    @GeneratedValue 
    @Column(name="email_address_id") 
    private int emailAddressId; 

    @Column(name="email_address") 
    private String emailAddress; 

    @Column(name="contact_id") 
    private int contactId; 

    public void setContactId(int contactId){ 
     this.contactId=contactId; 
    } 

    public int getContactId(){ 
     return this.contactId; 
    }. 

    public int getEmailAddressId(){ 
     return emailAddressId; 
    } 

    public void setEmailAddressId(final int emailAddressId){ 
     this.emailAddressId=emailAddressId; 
    } 

    public String getEmailAddress(){ 
     return emailAddress; 
    } 

    public void setEmailAddress(String emailAddress){ 
     this.emailAddress=emailAddress; 
    } 
} 
@Entity 
@Table(name="contact") 
public class Contact implements Serializable {  
    @OneToMany(fetch=FetchType.EAGER) 
    @JoinColumn(name="contact_id") 
    private Collection<ContactEmailAddress> contactEmailAddress; 

    @OneToMany(fetch=FetchType.EAGER) 
    @JoinColumn(name="contact_id") 
    private Collection<ContactNickname> contactNickname; 

    public Collection<ContactEmailAddress> getContactEmailAddress(){ 
     return this.contactEmailAddress; 
    } 

    public void setContactEmailAddress(Collection<ContactEmailAddress> contactEmailAddress){   
     this.contactEmailAddress=contactEmailAddress; 
    } 

    public Collection<ContactNickname> getContactNickname(){ 
     return this.contactNickname; 
    } 

    public void setContactNickname(final Collection<ContactNickname> contactNickname){ 
     this.contactNickname=contactNickname; 
    }  
} 

최대 절전 모드 중복이 발생하는 경우 다음을 실행 중입니다.

SELECT contact0_.contact_id    AS contact_1_0_0_, 
     contact0_.dob     AS dob2_0_0_, 
     contact0_.family_name   AS family_n3_0_0_, 
     contact0_.given_name    AS given_na4_0_0_, 
     contact0_.middle_name   AS middle_n5_0_0_, 
     contactema1_.contact_id   AS contact_2_0_1_, 
     contactema1_.email_address_id AS email_ad1_1_1_, 
     contactema1_.email_address_id AS email_ad1_1_2_, 
     contactema1_.contact_id   AS contact_2_1_2_, 
     contactema1_.email_address  AS email_ad3_1_2_, 
     contactnic2_.contact_id   AS contact_2_0_3_, 
     contactnic2_.contact_nickname_id AS contact_1_3_3_, 
     contactnic2_.contact_nickname_id AS contact_1_3_4_, 
     contactnic2_.contact_id   AS contact_2_3_4_, 
     contactnic2_.nickname   AS nickname3_3_4_ 
FROM contact contact0_ 
     LEFT OUTER JOIN contact_email_address contactema1_ 
        ON contact0_.contact_id = contactema1_.contact_id 
     LEFT OUTER JOIN contact_nickname contactnic2_ 
        ON contact0_.contact_id = contactnic2_.contact_id 
WHERE contact0_.contact_id =? 

친절함에 대해서는 이안.

+0

기본적으로 단방향 oneToMany 매핑을 수행하려고합니다. 당신은이 매우 유사한 질문에서 설명한 바와 같이 'referencedColumnName'속성이 없습니다. http://stackoverflow.com/questions/12038380/how-to-define-unidirectional-onetomany-relationship-in-jpa – Gimby

+0

@Gimby referencedColumnName = "contact_id"를 설정할 때 동일한 결과 집합 –

+0

흠. 가능성을 배제하기 위해 : 컬렉션에서 EAGER 페칭을 제거 할 때 어떤 변화가 있습니까? – Gimby

답변

0

컬렉션에 복제본을 원하지 않으면 엔티티에 Collection 대신 Set을 사용해야합니다.