2009-08-20 5 views
25

मुझे लगता है कि हाइबरनेट में संग्रह से हटाते समय अनाथ रिकॉर्ड हटाए जा रहे हैं। मैं, कुछ सरल गलत कर किया जाना चाहिए (इस हाइबरनेट-101 है!), लेकिन मैं यह नहीं मिल रहा ..संग्रह अद्यतन करते समय अनाथों को हटाने के लिए हाइबरनेट हटाना

निम्नलिखित को देखते हुए:

public class Book { 
    @ManyToOne 
    @NotNull 
    Author author; 
} 
public class Author 
{ 
    @OneToMany(cascade={CascadeType.ALL}) 
    List<Book> books; 
} 

और निम्न अद्यतन कोड:

Author author = authorDAO.get(1); 
Book book = author.getBooks().get(0); 
author.getBooks().remove(0); 
authorDAO.update(author); 

AuthorDAO स्निपेट:

@Override 
public void update(T entity) { 
    getSession().update(entity); 
} 

निम्नलिखित टेस्ट में विफल रहता है:

0,123,
Author author = author.get(1); 
assertEquals(0,author.getBooks().size()); // Passes 
Book dbBook = bookDAO.get(book.getId()) 
assertNull(dbBook); // Fail! dbBook still exists! 
assertFalse(author.getBooks().contains(dbBook) // Passes! 

सारांश में, मैं खोजने हूँ:

  • पुस्तक पुस्तकों के लेखक का संग्रह से निकाल दिया जाता है, यह अभी भी डेटाबेस
  • अगर मैं book.getAuthor().getBooks() की जांच, किताब में मौजूद नहीं है में मौजूद है उस संग्रह

यह "लगता है" की तरह मैं सत्र निस्तब्धता या अद्यतन उचित रूप से मजबूर कर नहीं कर रहा हूँ - लेकिन मुझे यकीन है कि मैं कहाँ है कि क्या करना चाहिए नहीं कर रहा हूँ। कि नस-साथ अन्य बिंदुओं कि को प्रभावित किया जा सकता है:

  • मैं एक JUnit परीक्षण @RunWith(SpringJUnit4ClassRunner.class)
  • के साथ सजाया में ऊपर प्रदर्शन कर रहा हूँ मैं मूल रूप से एक अद्यतन दिनचर्या के अंदर इस समस्या जो @Transactional साथ सजाया गया है हालांकि, मारा, मैंने इसे एक पुराने पुराने जुनीट परीक्षण में फिर से बनाया है।

किसी भी सलाह की सराहना की जाएगी!

संपादित करें: पहले से ही सभी प्रतिक्रियाओं के लिए धन्यवाद। इसके अलावा नीचे टिप्पणी करने के लिए, मैं माता-पिता के लिए @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) जोड़ दिया है, तो यह अब है:

public class Author 
{ 
    @OneToMany(cascade={CascadeType.ALL}) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    List<Book> books; 
} 

मैं अभी भी एक ही परिणाम की खोज कर रहा हूँ। मुझे कुछ आसान याद आना चाहिए।

उत्तर

16

आप कुछ भी गलत नहीं कर रहे हैं। आप सिर्फ बच्चे की इकाई को नहीं हटा रहे हैं। आप या तो बच्चे इकाई के एक स्पष्ट निकालने() के साथ ऐसा कर सकते हैं (जो भी आप कर रहे हैं उसके अतिरिक्त) या उस एनोटेशन का उपयोग करें जो अनाथ रिकॉर्ड को हटा देता है।

इसके अलावा, यह उल्लेखनीय है कि CascadeType.DELETE या तो अनाथ को नहीं हटाएगा। इसका मतलब कुछ और है। JPA CascadeType.ALL does not delete orphans.

मूल रूप से करने के लिए यह अपने आप आपके माता-पिता में संग्रह पर इस चाहता हूँ देखें:

org.hibernate.annotations.CascadeType.DELETE_ORPHAN 
+0

मैंने इस एनोटेशन को जोड़ा है, लेकिन यह अभी भी काम नहीं कर रहा है - पहले जैसा ही परिणाम। –

+2

क्या आप पुस्तक में लेखक संदर्भ को शून्य में भी सेट कर रहे हैं? – cletus

+0

नहीं, मैंने सोचा था कि DELETE_OPRHAN एनोटेशन का बिंदु था? –

0

कोशिश निम्नलिखित annoation का उपयोग कर अगर आप चाहते हैं 'सकर्मक निर्भरता' behavour।

@ org.hibernate.annotations.Cascade (कैस्केड टाइप।DELETE_ORPHAN)

3

@OneToMany एनोटेशन में झरना विकल्प के लिए एक सरणी है, क्या आप चाहते हैं:

@OneToMany(cascade={CascadeType.ALL, CascadeType.DELETE_ORPHAN}) 
0

@onDelete जोड़ने कृपया शायद के लिए आप

public class Author 
{ 
    @OneToMany(cascade={CascadeType.ALL}) 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    List<Book> books; 
} 
+0

हाय। इसका कोई प्रभाव नहीं पड़ता है। –

+0

क्या आप अपना सत्र प्रतिबद्ध करते हैं या हटाए जाने के बाद इसे फ्लश करते हैं? – Am1rr3zA

0

यह काम ऐसा लगता है कि कर रहे हैं हो सकता है कि मैप किया गया एनोटेशन। आज़माएं:

public class Book { 
    @ManyToOne 
    @NotNull 
    Author author; 
} 
public class Author { 
    @OneToMany(mappedBy="author", cascade={CascadeType.ALL}) 
    List<Book> books; 
} 
35

उनके समाधान की तलाश करने वाले लोगों के लिए: अब हाइबरनेट में, resp। जेपीए 2.0, यह सही तरीका है:

@OneToMany(orphanRemoval=true) 
संबंधित मुद्दे