Я обнаружил, что сиротские записи не удаляются при удалении из коллекции в Hibernate. Я, должно быть, делаю что-то простое (это Hibernate-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);
}
Следующий тест не проходит:
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
, однако с тех пор я воссоздал ее в простом старом тесте JUnit.
Любой совет будет очень признателен!
РЕДАКТИРОВАТЬ: Спасибо за все отзывы. В дополнение к комментариям ниже я добавил @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
к родительскому элементу, так что теперь он:
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
Я все еще нахожу те же результаты. Я ДОЛЖЕН упустить что-то простое.