मेरे पास एक क्लास उपयोगकर्ता है। एक उपयोगकर्ता कई अन्य उपयोगकर्ताओं के साथ एक दोस्त हो सकता है। रिश्ता पारस्परिक है। यदि ए बी का मित्र है तो बी ए का मित्र है। इसके अलावा मैं अतिरिक्त डेटा स्टोर करने के लिए हर संबंध चाहता हूं - उदाहरण के लिए जब दो उपयोगकर्ता दोस्त बन गए थे। तो यह अतिरिक्त कॉलम के साथ एक ही टेबल पर कई से अधिक रिश्तों है। मुझे पता है कि एक मध्यम वर्ग दोस्ती बनाई जानी चाहिए (तिथि के लिए दो उपयोगकर्ता आईडी और कॉलम)। लेकिन मैं हाइबरनेट के साथ मैपिंग में छोटा आ रहा हूं। जो चीज मुझे रोकती है वह यह है कि मैपिंग एक ही टेबल पर है। यदि मैं कई अलग-अलग संबंधों के बीच दो अलग-अलग तालिकाओं के बीच था, तो मैं इसे हल कर सकता हूं।अतिरिक्त कॉलम के साथ एक ही टेबल पर कई से अधिक
10
A
उत्तर
7
आप एक ही मेज
पर कहा है
कई-से-अनेक संबंध यह एक अच्छा विचार नहीं है। यह बनाए रखने के लिए एक दुःस्वप्न है।
इस एक के बजाय
@Entity public class Friend { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer friendId; @Column private String name; @OneToMany(mappedBy="me") private List<MyFriends> myFriends; } @Entity public class MyFriends { @EmbeddedId private MyFriendsId id; @Column private String additionalColumn; @ManyToOne @JoinColumn(name="ME_ID", insertable=false, updateable=false) private Friend me; @ManyToOne @JoinColumn(name="MY_FRIEND_ID", insertable=false, updateable=false) private Friend myFriend; @Embeddable public static class MyFriendsId implements Serializable { @Column(name="ME_ID", nullable=false, updateable=false) private Integer meId; @Column(name="MY_FRIEND_ID", nullable=false, updateable=false) private Integer myFriendId; public boolean equals(Object o) { if(o == null) return false; if(!(o instanceof MyFriendsId)) return false; MyFriendsId other = (MyFriendsId) o; if(!(other.getMeId().equals(getMeId())) return false; if(!(other.getMyFriendId().equals(getMyFriendId())) return false; return true; } public int hashcode() { // hashcode impl } } }
संबंध है की कोशिश करें,
2
मुझे यकीन नहीं है कि यह आपके मामले में फिट होगा, लेकिन इसे आज़माएं।
@Entity
public class Friend {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendId;
@Column
private String name;
@ManyToMany(mappedBy="owner")
private List<Friendship> friendships;
}
@Entity
public class Friendship {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendshipId;
@OneToOne
private Friend owner;
@OneToOne
private Friend target;
// other info
}
1
मैं एक ही समस्या थी। आप इस तरह कुछ कोशिश कर सकते हैं:
<class name="Friend" entity-name="RelatedFriend" table="FRIENDS">
<id name="id" type="long">
<generator class="native" />
</id>
<!-- *** -->
<set name="relatedFriends" table="RELATED_FRIENDS">
<key column="FRIEND_ID" />
<many-to-many column="RELATED_FRIEND_ID" class="Friend" entity-name="RelatedFriend"/>
</set>
</class>
आपके उत्तर के लिए धन्यवाद। लेकिन मेरे पास एक प्रश्न है। @ManyToOne रिश्ते में "डालने योग्य = झूठा" क्यों रखा गया है? अगर मैं इसे हटा देता हूं तो यह काम करता है। अन्यथा MyFriends ठीक से जारी नहीं है। मैं एक हाइबरनेट विशेषज्ञ नहीं हूं इसलिए शायद मुझे कुछ समझ में नहीं आ रहा है। –
ठीक है, मैंने आपके जैसे एंबेडेड आईडी का उपयोग नहीं किया है, बल्कि सिर्फ एक और आईडी कॉलम है। आपने डालने योग्य = झूठा रखा है क्योंकि एम्बेडेडआईडी इसका ख्याल रखता है। आपका उत्तर स्वीकार कर लिया गया है :) –
आपने देखा है क्यों। जब दो गुण एक ही कॉलम साझा करते हैं, तो केवल एक संपत्ति में इसके बारे में सेटिंग्स रखना एक अच्छा विचार है। अन्यथा, हाइबरनेट कुछ त्रुटियों की शिकायत करेगा। –