2012-09-24 3 views
5

पर अनाथ बच्चों को नहीं हटाता। टीम team_ से team2_0_ रूप team_.team_name चयन team_.id,:हाइबरनेट मैं कई संबंधों के लिए बहुत सरल एक निम्नलिखित है OneToMany

@Entity(name = "PLAYER") 
@Access(AccessType.PROPERTY) 
public class Player implements Serializable{ 

    private int id; 
    private String name; 

    @Id 
    @Column(name = "id") 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name = "player_name") 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    @Override 
    public boolean equals(Object obj) { 
    return id == ((Player)obj).id; 
    } 
    @Override 
    public int hashCode() { 
     return id; 
    } 
} 

मैं एक बहुत ही सरल कोड चलाएँ:

Team team = createTeam(3) // creates team with 3 players ids={1,2,3} 
session.saveOrUpdate(team); 
... 

private Team createTeam(int players) { 
    Team team = new Team(); 
    team.setName("Bears"); 
    team.setId(1); 
    for(int i=1 ; i<=players; ++ i){ 
     Player player = new Player(); 
     player.setId(i); 
     player.setName("Player"+i); 
     team.addPlayer(player); 
    } 
    return team; 
} 

और मैं उम्मीद के रूप में निम्नलिखित हैं:

  • हाइबरनेट जहां team_.id =?
  • हाइबरनेट: प्लेयर_.आईडी, player_.player_name को प्लेयर 2_1_ के रूप में प्लेयर प्लेयर__1_ से चुनें जहां player_.id =?
  • हाइबरनेट: प्लेयर_.आईडी, player_.player_name को प्लेयर 2_1_ के रूप में प्लेयर प्लेयर__1_ से चुनें जहां player_.id =?
  • हाइबरनेट: प्लेयर_.आईडी, player_.player_name को प्लेयर 2_1_ के रूप में प्लेयर प्लेयर__1_ से चुनें जहां player_.id =?
  • हाइबरनेट: टीम में डालने (TEAM_NAME, आईडी) मूल्यों
  • हाइबरनेट (,?): (?) खिलाड़ी (PLAYER_NAME, आईडी) मूल्यों
  • हाइबरनेट में दर्ज करें: खिलाड़ी (PLAYER_NAME, आईडी में डालें) मान (?,?)
  • हाइबरनेट: प्लेयर (प्लेयर_नाम, आईडी) मान (?,?)
  • हाइबरनेट: प्लेयर सेट TEAM_ID = अपडेट करें? आईडी = कहाँ? हाइबरनेट: प्लेयर सेट TEAM_ID = अपडेट करें? आईडी = कहाँ? हाइबरनेट: प्लेयर सेट TEAM_ID = अपडेट करें? आईडी = कहाँ?

फिर बाद में मुझे क्या करना:

Team team = createTeam(2) // creates team with 2 player ids={1,2} 
session.saveOrUpdate(team); 

और उम्मीद अनाथ खिलाड़ियों हटाए जाने के लिए, लेकिन मैं मिलता है:

  • हाइबरनेट: चुनिंदा team_.id, team_.team_name टीम से team2_0_ के रूप में team_ जहां team_.id =?
  • हाइबरनेट: प्लेयर_.आईडी, player_.player_name को प्लेयर 2_1_ के रूप में प्लेयर प्लेयर__1_ से चुनें जहां player_.id =?
  • हाइबरनेट: प्लेयर_.आईडी, player_.player_name को प्लेयर 2_1_ के रूप में प्लेयर प्लेयर__1_ से चुनें जहां player_.id =?
  • हाइबरनेट: प्लेयर सेट करें TEAM_ID = null जहां TEAM_ID =?
  • हाइबरनेट: प्लेयर सेट TEAM_ID = अपडेट करें? आईडी = कहाँ?
  • हाइबरनेट: प्लेयर सेट TEAM_ID = अपडेट करें? आईडी = कहाँ?

जो अनाथ खिलाड़ी (आईडी = 3) डिस्कनेक्ट हो जाता है लेकिन हटाया नहीं जाता है ... कोई विचार जो मैं गलत करता हूं?

+1

'createTeam()' विधि क्या कर रही है? – dcernahoschi

+0

खिलाड़ियों के साथ एक टीम बनाता है –

+0

यह संबंधित हो सकता है या नहीं, लेकिन हम इसे HSQL –

उत्तर

0

मैप किए गए जोड़ें दोनों इकाइयों के रिश्ते में विशेषता।

प्लेयर में टीम जोड़ें।

// in Player.java 
@ManyToOne(mappedBy="players") 
private Team team; 

और प्लेयर में MappeedBy।

//In Team.java 
@OneToMany(cascade = {CascadeType.ALL},orphanRemoval=true,mappedBy="team") 
    @JoinColumn(name = "TEAM_ID") 
    public Set<Player> getPlayers() { 
     return players; 
    } 

जब आपके पास 1-से-एम संबंध है, तो बच्चे को अपने माता-पिता का संदर्भ होना चाहिए। फिर बाल तालिका में एक विदेशी के रूप में आंतरिक रूप से माता-पिता की आईडी का उपयोग करता है।

आपके बच्चे मेज इन 3 कॉलम होगा:

id , player_name,team_id 
+1

के साथ कोड उदाहरण अपडेट किया गया है एसोसिएशन बिडरेक्शनल बनाने का कोई कारण नहीं है।और वैसे भी, एक द्विपक्षीय सहयोग में, केवल पक्षों में से एक को मैप किया गया गुण होना चाहिए, क्योंकि इसका मतलब है: "दूसरी ओर एसोसिएशन के लिए मैपिंग देखें"। –

3

आप चाहते हैं कि खिलाड़ियों को नष्ट-अनाथ के रूप में निकाल दिए जाते हैं, तो आप की जरूरत है खिलाड़ियों ढीला है कि टीम के संदर्भ में और टीम को बचाने के।

  • एक नई वस्तु टीम बनाएँ:

    तुम क्या कर रहे पीछा कर रहा है।

  • 3 खिलाड़ियों के साथ फ़ीड टीम
  • जारी रहती है

उसके बाद, प्रत्येक खिलाड़ी पंक्ति टीम के लिए एक FK शामिल होंगे (आईडी = 1)।

फिर कोड एक ही आईडी के साथ एक नई टीम बनाता है, और 2 खिलाड़ियों को खिलाता है और जारी रहता है।

उस समय वहाँ अभी भी है कि टीम के लिए संदर्भ 1.

मेरी पीओवी हर विभिन्न व्यावसायिक वस्तु अपने स्वयं के व्यवसाय प्रमुख होना चाहिए से डीबी में एक खिलाड़ी के लिए किया जाएगा। यदि आप टीम 1 के खिलाड़ियों को ओवरराइट करना चाहते हैं, तो आपको सबसे पहले टीम को पुनर्प्राप्त करना चाहिए जहां id = 1 है, और फिर खिलाड़ियों को खिलाएं।

private Team createTeam(int players) { 
    Team team = session.get(Team.class, 1); 
    if (team == null) { 
     team = new Team(); 
     team.setName("Bears"); 
     team.setId(1); 
    } 
    team.clearPlayers(); 

    for(int i=1 ; i<=players; ++ i){ 
     Player player = new Player(); 
     player.setId(i); 
     player.setName("Player"+i); 
     team.addPlayer(player); 
    } 
    return team; 
} 

// Team.java 
private void clearPlayers() { 
    players.clear(); 
} 

बीटीडब्ल्यू, एक और सलाह। अपने खिलाड़ियों को सीधे संशोधित करने की अनुमति न दें, जिससे हम "HibernateErrors" को संग्रहित कर सकते हैं "संग्रह के संदर्भ को न बदलें ..."। setPlayers() के बजाय, addPlayer() के लिए विधियां जोड़ें और removePlayer()

private void adddPlayer(Player player) { 
    player.setTeam(this); 
    players.add(player); 
} 

private void removePlayer(Player player) { 
    player.setTeam(null); 
    players.remove(player); 
} 

इसके अलावा, एक संग्रह परिवर्तनशील है, इसलिए getPlayers (बनाने) एक गैर-परिवर्तनीय संग्रह वापस जाने के लिए:

private Set<Player> getPlayers() { 
    return Collections.unmodifiableSet(players); 
} 

आशा यह कुछ शेड प्रकाश :)

1

आप इस टैग का उपयोग कर सकते हैं: @ org.hibernate.annotations.Cascade (value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)। तो आपको मिलेगा:

@OneToMany (झरना = {} CascadeType.ALL, orphanRemoval = true) @ org.hibernate.annotations.Cascade (मूल्य = org.hibernate.annotations.CascadeType.DELETE_ORPHAN) @JoinColumn (नाम = "TEAM_ID")

संबंधित मुद्दे