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 =?
친절함에 대해서는 이안.
기본적으로 단방향 oneToMany 매핑을 수행하려고합니다. 당신은이 매우 유사한 질문에서 설명한 바와 같이 'referencedColumnName'속성이 없습니다. http://stackoverflow.com/questions/12038380/how-to-define-unidirectional-onetomany-relationship-in-jpa – Gimby
@Gimby referencedColumnName = "contact_id"를 설정할 때 동일한 결과 집합 –
흠. 가능성을 배제하기 위해 : 컬렉션에서 EAGER 페칭을 제거 할 때 어떤 변화가 있습니까? – Gimby