2009-12-02 12 views
10

मेरे पास एक क्लास उपयोगकर्ता है। एक उपयोगकर्ता कई अन्य उपयोगकर्ताओं के साथ एक दोस्त हो सकता है। रिश्ता पारस्परिक है। यदि ए बी का मित्र है तो बी ए का मित्र है। इसके अलावा मैं अतिरिक्त डेटा स्टोर करने के लिए हर संबंध चाहता हूं - उदाहरण के लिए जब दो उपयोगकर्ता दोस्त बन गए थे। तो यह अतिरिक्त कॉलम के साथ एक ही टेबल पर कई से अधिक रिश्तों है। मुझे पता है कि एक मध्यम वर्ग दोस्ती बनाई जानी चाहिए (तिथि के लिए दो उपयोगकर्ता आईडी और कॉलम)। लेकिन मैं हाइबरनेट के साथ मैपिंग में छोटा आ रहा हूं। जो चीज मुझे रोकती है वह यह है कि मैपिंग एक ही टेबल पर है। यदि मैं कई अलग-अलग संबंधों के बीच दो अलग-अलग तालिकाओं के बीच था, तो मैं इसे हल कर सकता हूं।अतिरिक्त कॉलम के साथ एक ही टेबल पर कई से अधिक

उत्तर

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 
     } 

    } 


} 

संबंध है की कोशिश करें,

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मेरे पास एक प्रश्न है। @ManyToOne रिश्ते में "डालने योग्य = झूठा" क्यों रखा गया है? अगर मैं इसे हटा देता हूं तो यह काम करता है। अन्यथा MyFriends ठीक से जारी नहीं है। मैं एक हाइबरनेट विशेषज्ञ नहीं हूं इसलिए शायद मुझे कुछ समझ में नहीं आ रहा है। –

+0

ठीक है, मैंने आपके जैसे एंबेडेड आईडी का उपयोग नहीं किया है, बल्कि सिर्फ एक और आईडी कॉलम है। आपने डालने योग्य = झूठा रखा है क्योंकि एम्बेडेडआईडी इसका ख्याल रखता है। आपका उत्तर स्वीकार कर लिया गया है :) –

+0

आपने देखा है क्यों। जब दो गुण एक ही कॉलम साझा करते हैं, तो केवल एक संपत्ति में इसके बारे में सेटिंग्स रखना एक अच्छा विचार है। अन्यथा, हाइबरनेट कुछ त्रुटियों की शिकायत करेगा। –

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> 
संबंधित मुद्दे