2010-06-19 12 views
7

में बचाने मैं रिश्ता हैअद्यतन OneToMany सूची हाइबरनेट

  • a.getId() -> वर्तमान नई आईडी ठीक
  • a.getBList() -> अभी भी शून्य ...

तो, इस मामले में bList क्यों अपडेट नहीं है?

मैं एक के बाद बचाने के फिर से लोड करने की कोशिश की, इस तरह से:

A a=new A(); 
// setting A 

B b=new B(); 
// setting B 
b.setA(a); 

session.save(b); 

A loadedA=(A)session.get(A, a.getId()); 

लेकिन loadedA अभी भी एक शून्य blist एक तरह की है।

स्वाभाविक रूप से इस समस्या को मैं तेरा तरह से कर से बचने के लिए:

A a=new A(); 
// setting A 

B b=new B(); 
// setting B 

List<B> bList=new ArrayList<B>(); 
bList.add(b); 
a.setBList(bList); 

session.save(a); // this save a and b 

इस तरह से सब अच्छा काम करते हैं, लेकिन मेरे सवाल यह है: क्यों आईडी सही ढंग से संचालन और blist सहेजने के बाद अपडेट नहीं? मुझे एक उदाहरण सही ढंग से पुनः लोड करने के लिए एक चुनिंदा कथन के साथ डीबी से पूछताछ करना है?


अद्यतन

मैं

StaleStateException यह अपवाद है: बैच अद्यतन अद्यतन से अप्रत्याशित पंक्ति संख्या लौटे

जब मैं के बाद saveOrUpdate इकाई एक करने की कोशिश इससे बी हटाना

// first delete old b record 
Session session=HibernateUtil.getSessionFactory().getCurrentSession(); 
session.beginTransaction(); 
a.getBList().remove(b); 
b.setA(null); 
session.delete(b); 
// session.clear(); // this would solve my problem, but is it correct?? 
session.getTransaction().commit(); 

// then insert new b record 
Session session=HibernateUtil.getSessionFactory().getCurrentSession(); 
session.beginTransaction(); 
B b=new B(); 
a.getBList().add(b); 
b.setA(a); 
session.saveOrUpdate(a); 
session.getTransaction().commit(); // this throw exception 

यह दो ऑपरेशन पाठ्यक्रम की एक ही विधि में नहीं हैं, गुई घटना द्वारा निकाल दिए जाते हैं।

session.clear असली समाधान है? मैं कर रहा हूँ (शायद) गलत?

अद्यतन

को हटाने session.delete (ख) समस्या फिर से हल किया जाता है ... इसलिए, क्या corretc तरीका है? .. मुझे पता है ... im पूरी तरह से हाइबरनेट साथ noob

उत्तर

4

ओह ... ठीक

session.refresh(a); 

यह काम अच्छा ... यह समाधान है, सही नहीं है?

A a = new A(); 
B b = new B(); 
a.getBList().add(b); 
b.setA(a); 

session.persist(b); 

और वास्तव में, आम पैटर्न इस तरह बचाव की मुद्रा में कड़ी प्रबंधन के तरीके को लागू करने की है:

+1

ब्लो, यहाँ http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html # ऑब्जेक्टस्टेट-ट्रांजिटिव आप किस दृढ़ता विधि के बारे में अच्छी जानकारी प्राप्त कर सकते हैं कैस्केडिंग –

6

जब द्वि-दिशात्मक संघों के साथ काम कर रहा है, तो आप संघ के दोनों पक्षों पर लिंक स्थापित करने के लिए:

public class A { 

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY) 
    @Cascade(CascadeType.SAVE_UPDATE) 
    private List<B> bList = new ArrayList<B>(); 

    protected List<B> getListB() { 
     return bList; 
    } 

    protected void setListB(List bList) { 
     this.bList = bList; 
    } 

    public void addBToBs(B b) { 
     bList.add(b); 
     b.setA(this); 
    } 

    //... 
} 

और कोड हो जाता है:

A a = new A(); 
B b = new B(); 
a.addBToBs(b); 

session.persist(b); 

यह हाइबरनेट ट्यूटोरियल में चर्चा की है:

+0

का उपयोग करते समय उपयोग करने के लिए पास्कल – blow

+0

@blow: आपका स्वागत है। –

+0

अद्यतन .......... – blow

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