2012-05-08 27 views
5

Tôi có một ứng dụng tải các đối tượng qua chế độ ngủ đông và sau đó chuyển các đối tượng đó đến một tầng khác như các đối tượng tách rời. Bất kỳ thay đổi nào đối với các đối tượng đó đều được gửi xuống tầng hibernate nơi tôi gọi saveOrUpdate() trên các đối tượng đó.Sẽ Hibernate saveOrUpdate phương pháp xóa trẻ em?

Sẽ ngủ đông xóa các mối quan hệ một-nhiều đối tượng con có trong bộ sưu tập trong các đối tượng được chuyển vào saveOrUpdate() nếu tôi chỉ xóa đối tượng con khỏi bộ sưu tập trước khi gọi saveOrUpdate()?

Nếu không, thì điều này thường được thực hiện như thế nào trong ứng dụng ngủ đông sử dụng các đối tượng tách rời?

Trả lời

5

Sẽ hibernate xóa mối quan hệ một-nhiều đối tượng con có trong bộ sưu tập trong các đối tượng được chuyển vào saveOrUpdate() nếu tôi chỉ cần xóa đối tượng con khỏi bộ sưu tập trước khi gọi saveOrUpdate()?

Không, không theo mặc định. Các đối tượng con như vậy được gọi là "trẻ mồ côi" trong ngữ cảnh này, giả định rằng một số thực thể khác cũng không có tham chiếu đến chúng.

này được thảo luận trong các tài liệu, 11.11. Transitive persistence:

Một phong cách thác đặc biệt, delete-orphan, chỉ áp dụng cho một-nhiều hiệp hội, và chỉ ra rằng hoạt động delete() nên được áp dụng cho bất kỳ đối tượng trẻ em mà được xóa khỏi liên kết. Sử dụng chú thích không có số CascadeType.DELETE-ORPHAN tương đương. Thay vào đó, bạn có thể sử dụng thuộc tính orphanRemoval như trong Ví dụ 11.4, “@OneToMany với orphanRemoval”. Nếu một thực thể bị xóa khỏi bộ sưu tập @OneToMany hoặc một thực thể liên quan bị hủy tham chiếu từ liên kết @OneToOne, thực thể được liên kết này có thể được đánh dấu để xóa nếu orphanRemoval được đặt thành true.

+0

Điều đó có ý nghĩa. Tuy nhiên, khi tôi đặt CascadeType.ALL, orphanRemoval = true trên bộ sưu tập đối tượng con vẫn chưa bị xóa. Điều này có thể là do thực tế tôi đang sử dụng chú thích JoinColumn kết hợp với chú thích OneToMany? – Tom

+0

@Tom: Có thể không, không, '@ JoinColumn' chỉ được sử dụng để ghi đè tên cột tham gia mặc định. Có vẻ như Hibernate không nghĩ rằng đó là một đứa trẻ mồ côi. Bạn có chắc một số thực thể khác không có tham chiếu đến đứa trẻ đó không? – skaffman

+0

Nó chắc chắn không được tham chiếu từ một thực thể khác. Mối quan hệ db cơ bản thực sự là một ManyToMany, tuy nhiên, và tôi đang sử dụng OneToMany với JoinColumn để làm cho mô hình đơn giản hơn. Có lẽ đó là ném nó? Nếu không, tôi cũng chỉ nhận thấy rằng một số thực thể con của đứa trẻ chứa các mối quan hệ ManyToOne mà không thể có thuộc tính orphanRemoval được đặt trên chúng. Có lẽ đó là ngăn chặn xóa của cha mẹ bằng cách nào đó. – Tom

0

Theo mặc định, nó sẽ không. Bạn có thể sử dụng @Cascade (CascadeType.DELETE_ORPHANS) để đạt được điều đó.

Các vấn đề liên quan