2010-12-27 5 views
14

Tôi đang sử dụng Hibernate 3.6 và có mã của tôi chú thích (so với sử dụng các tệp ánh xạ ngủ đông). Tôi chạy vào "vấn đề" được biết đến của việc sử dụng các tùy chọn xếp tầng JPA không tương thích với CascadeType của Hibernate (xem liên kết này để biết thêm thông tin http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/).Lẫn lộn giữa JPA và Hibernate tầng

Tôi đã hy vọng được làm rõ thêm một chút về vấn đề này. Tôi có một số câu hỏi cụ thể:

1) Vì vậy, @Cascade ({CascadeType.SAVE_UPDATE}) hoạt động cho saveOrUpdate(), nhưng nó cũng áp dụng nếu tôi sử dụng merge() hoặc persist()? hoặc tôi có phải sử dụng tất cả ba CascadeTypes Hibernate không?

2) Làm cách nào để quyết định có nên sử dụng tùy chọn xếp tầng JPA hoặc chú thích Hibernate @Cascade thay thế không?

2) Có một "lỗi" được gửi trong Hibernate, nhưng các nhà phát triển dường như coi đây là vấn đề về tài liệu, (tôi hoàn toàn không đồng ý với họ), và tôi không thấy rằng nó đã được giải quyết tài liệu nói. Bất cứ ai biết tại sao điều này là "làm việc như thiết kế" và không phải là một lỗi trong thực hiện JPA Hibernate của?

Rất cám ơn trước.

Trả lời

13

Hành vi này được ghi lại trong 11.11. Transitive persistence.

  1. Loại thác ngủ đông tương ứng với từng hoạt động, vì vậy bạn cần cả ba.

  2. Trong hầu hết các trường hợp, bạn cần hoặc là CascadeType.ALL hoặc không có tầng nào cả. Trong trường hợp đó chú thích JPA là đủ, vì JPA's CascadeType.ALL cũng bao gồm tất cả các hoạt động Hibernate. Nếu không, nếu bạn cần kiểm soát xếp hạt mịn (và sử dụng giao diện Session của Hibernate), bạn cần @Cascade của Hibernate.

  3. Nó không phải là lỗi trong triển khai JPA, bởi vì nếu bạn sử dụng JPA's EntityManager mọi thứ hoạt động tốt. Vấn đề này chỉ tồn tại nếu bạn kết hợp các chú thích JPA với giao diện Session của Hibernate.

+0

1. Nếu tôi hiểu chính xác rằng Hibernate đang triển khai JPA, tôi đã mong đợi SAVE_UPDATE của Hibernate để xếp vào JPA's persist() và merge(), nhưng tôi hiểu tại sao tôi cần cả ba. – Jay

+0

2. Điều này làm tôi khó chịu - TẤT CẢ sẽ làm việc cho cả hai, nhưng nếu bạn không sử dụng TẤT CẢ, Hibernate không đủ "thông minh" để lập bản đồ cho bạn. Tôi cũng thấy không có gì trong tài liệu Hibernate về việc sử dụng @Cascade với Hibernate Sessions (và đây là lý do tại sao tôi nghĩ rằng báo cáo lỗi là hợp lệ). – Jay

+0

Nhưng MANY cảm ơn vì phản hồi! – Jay

1

Từ tài liệu tham khảo Hibernate

Đối với mỗi hoạt động cơ bản của phiên Hibernate - trong đó có tồn tại(), sáp nhập(), saveOrUpdate(), xóa(), khóa(), làm mới(), đuổi (), sao chép() - một thác phong cách tương ứng

Nếu bạn thấy CascadeType tài liệu, bạn sẽ thấy mỗi phong cách thác đối với từng hoạt động phiên

Làm cách nào để quyết định có nên sử dụng tùy chọn xếp tầng JPA hoặc chú thích Hibernate @Cascade thay thế không?

Ưu tiên sử dụng kiểu ghép tầng JPA đơn giản khi sử dụng ứng dụng JPA thuần túy. Nếu sử dụng Hibernate, thích kiểu xếp tầng Hibernate

+0

Chỉ cần FYI, CascadeType.SAVE_UPDATE không được đề cập trong sách hướng dẫn, "xóa" áp dụng cho XML cho phương thức delete(), nhưng CascadeType.REMOVE áp dụng cho chú thích cho phương thức delete(). và CascadeType.REFRESH, CascadeType.EVICT và CascadeType.REPLICATE cũng không được đề cập trong sách hướng dẫn. – Jay