Tôi nhận thấy rằng các hồ sơ mồ côi không bị xóa khi xóa khỏi bộ sưu tập trong Hibernate. Tôi phải làm gì đó sai đơn giản, (đây là Hibernate-101!), Nhưng tôi không thể tìm thấy nó ..Hibernate xóa trẻ mồ côi khi cập nhật bộ sưu tập
Do sau:
public class Book {
@ManyToOne
@NotNull
Author author;
}
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
List<Book> books;
}
Và mã cập nhật sau:
Author author = authorDAO.get(1);
Book book = author.getBooks().get(0);
author.getBooks().remove(0);
authorDAO.update(author);
AuthorDAO đoạn mã:
@Override
public void update(T entity) {
getSession().update(entity);
}
các bài kiểm tra sau thất bại:
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!
Nói tóm lại, tôi đang tìm kiếm:
- Trong khi cuốn sách được lấy ra từ bộ sưu tập của Tác giả của cuốn sách, nó vẫn tồn tại trong cơ sở dữ liệu
- Nếu tôi kiểm tra
book.getAuthor().getBooks()
, cuốn sách không tồn tại trong bộ sưu tập đó
Điều này "cảm thấy" như tôi không xả phiên hoặc buộc cập nhật một cách thích hợp - nhưng tôi không chắc mình nên làm điều đó ở đâu. Cùng tĩnh mạch đó, điểm khác có thể ảnh hưởng:
- Tôi đang thực hiện ở trên trong một bài kiểm tra JUnit trang trí với
@RunWith(SpringJUnit4ClassRunner.class)
- tôi ban đầu trúng vấn đề này bên trong một thói quen cập nhật được trang trí với
@Transactional
, tuy nhiên, Tôi đã tái tạo nó trong một thử nghiệm JUnit cũ.
Bất kỳ lời khuyên nào sẽ được đánh giá rất nhiều!
EDIT: Cảm ơn tất cả các phản hồi đã có. Hơn nữa để bình luận dưới đây, tôi đã thêm @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
để phụ huynh, do đó, nó bây giờ:
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
Tôi vẫn đang tìm kiếm các kết quả tương tự. Tôi PHẢI mất một cái gì đó đơn giản.
Tôi đã thêm chú thích này nhưng chú thích vẫn không hoạt động - kết quả giống như trước đây. –
Bạn cũng có thể đặt tham chiếu tác giả trong sách thành không? – cletus
Không, tôi nghĩ đó là điểm chú thích DELETE_OPRHAN? –