Zauważam, że rekordy osierocone nie są usuwane podczas usuwania z kolekcji w stanie hibernacji. Muszę robić coś prostego źle, (jest to Hibernate-101!), Ale nie mogę go znaleźć ..Hibernowanie usuwa sieroty podczas aktualizacji kolekcji
Biorąc pod uwagę następujące elementy:
public class Book {
@ManyToOne
@NotNull
Author author;
}
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
List<Book> books;
}
i następujący kod aktualizacji:
Author author = authorDAO.get(1);
Book book = author.getBooks().get(0);
author.getBooks().remove(0);
authorDAO.update(author);
AuthorDAO snippet:
@Override
public void update(T entity) {
getSession().update(entity);
}
Poniższy Test nie powiedzie:
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!
Podsumowując, jestem znalezienia:
- Choć książka jest usuwany z kolekcji Autora książek, to nadal istnieje w bazie danych
- Gdybym zbadać
book.getAuthor().getBooks()
, książka nie istnieje w ta kolekcja:
"Czuję się" tak, jakbym nie spłukiwał sesji lub nie zmusił do aktualizacji - ale nie jestem pewien, gdzie powinienem to zrobić. Wzdłuż tej żyły, inne punkty, które mogą być wpływając:
- mam wykonywania powyższych czynności w teście JUnit ozdobione
@RunWith(SpringJUnit4ClassRunner.class)
- pierwotnie hit tego problemu wewnątrz procedury aktualizacji, który jest ozdobiony
@Transactional
jednak, Odtąd odtworzyłem go w zwykłym starym teście JUnit.
Każda rada byłaby bardzo ceniona!
EDYCJA: Dzięki za wszystkie opinie już. Dalsze komentarze poniżej, Dodałem @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
do rodzica, dlatego teraz:
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
ja wciąż znalezienie takich samych wyników. Muszę przegapić coś prostego.
Dodałem tę adnotację, ale nadal nie działa - takie same wyniki jak wcześniej. –
Czy ustawiasz również odniesienie do autora w książce na wartość null? – cletus
Nie, pomyślałem, że to była przyczyna adnotacji DELETE_OPRHAN? –