ब्लो, अगर ए और बी शेयर एक ही प्राथमिक कुंजी स्तंभ जहां दोनों संस्थाओं का उपयोग करके शामिल हो गए हैं उनके प्राथमिक कुंजी, आप के बजाय
@Entity
public class A implements Serializable {
private MutableInt id = new MutableInt();
private B b;
public void setIdAsMutableInt(MutableInt id) {
this.id = id;
}
@Id
@GeneratedValue
public Integer getId() {
return id.intValue();
}
public void setId(Integer id) {
this.id.setValue(id);
}
/**
* Any ToOne annotation, such as @OneToOne and @ManyToOne, is EARGELY loaded, by default
*/
@OneToOne(fetch=FetchType.LAZY)
@PrimaryKeyJoinColumn
@Cascade(CascadeType.SAVE_UPDATE)
public B getB() {
return b;
}
public void setB(B b) {
b.setIdAsMutableInt(id);
this.b = b;
}
}
@PrimaryKeyJoinColumn का उपयोग करना चाहिए और बी सूचना आप करते हैं mappedBy विशेषता की वजह से @PrimaryKeyJoinColumn की जरूरत नहीं
@Entity
public class B implements Serializable {
private MutableInt id = new MutableInt();
private A a;
public void setIdAsMutableInt(MutableInt id) {
this.id = id;
}
@Id
public Integer getId() {
return id.intValue();
}
public void setId(Integer id) {
this.id.setValue(id);
}
@OneToOne(fetch=FetchType.LAZY)
@PrimaryKeyJoinColumn
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
आइए टेस्ट पूर्णांक के बजाय (आप अगर आप चाहते हैं का परीक्षण कर सकते हैं)
A a = new A();
B b = new B();
a.setB(b);
/**
* b property will be saved because Cascade.SAVE_UPDATE
*/
Serializable id = session.save(a);
b = (B) session
.createQuery("from B b left join fetch b.a where b.id = :id")
.setParameter("id", id)
.list()
.get(0);
Assert.assertEquals(b.getId(), b.getA().getId());
सूचना मैं एक MutableInt क्षेत्र (एक पूर्णांक संपत्ति के द्वारा समझाया) का उपयोग करें क्योंकि पूर्णांक एक तरह से दोनों एक और के रूप में एक अपरिवर्तनीय प्रकार है बी शेयर वही सौंपा आईडी
लेकिन अगर ए और बी उनके प्राथमिक कुंजी के अलावा अन्य का उपयोग करके शामिल हो गए हैं, तो आप @JoinColumn और mappedBy का उपयोग करना चाहिए (द्वि-दिशात्मक संबंध, सही) के रूप में
इस प्रकार है
@Entity
public class A implements Serializable {
private Integer id;
private B b;
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
* mappedBy="a" means: Look at "a" field/property at B Entity. If it has any assigned value, join us Through B_ID foreign key column
*/
@OneToOne(fetch=FetchType.LAZY, mappedBy="a")
/**
* Table A has a foreign key column called "B_ID"
*/
@JoinColumn(name="B_ID")
@Cascade(CascadeType.SAVE_UPDATE)
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
}
और बी
@Entity
public class B implements Serializable {
private Integer id;
private A a;
public void setIdAsMutableInt(MutableInt id) {
this.id = id;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@OneToOne(fetch=FetchType.LAZY)
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
A a = new A();
B b = new B();
/**
* Set up both sides
* Or use some kind of add convenience method
*/
a.setB(b);
b.setA(a);
/**
* b property will be saved because Cascade.SAVE_UPDATE
*/
Serializable id = session.save(a);
b = (B) session
.createQuery("from B b left join fetch b.a where b.id = :id")
.setParameter("id", id)
.list()
.get(0);
परीक्षण करने के लिए स्वामी की ओर बी का उपयोग करके, आप दो का चयन बयान यह तब होता है मिल जाएगा क्योंकि बी तालिका किसी भी विदेशी कुंजी शामिल नहीं है कॉलम जो तालिका ए को इंगित करता है लेकिन
का उपयोग करके
"एक से एक बाएं में शामिल होने लाने अब जहां a.id =: आईडी"
आप सिर्फ एक का चयन स्टेटमेंट मिलेगा क्योंकि एक जानता है कि कैसे अपने B_ID विदेशी कुंजी स्तंभ
का उपयोग करके अपने में शामिल हो गए बी प्राप्त करने के लिए
धन्यवाद !! बहुत संपूर्ण! – blow