2011-12-19 15 views
8

Tôi đã thừa hưởng một cơ sở mã mà gần như tất cả các mối quan hệ có các chú thích như sau:Dòng thác của JPA = REMOVE và Hibernate's @OnDelete được sử dụng cùng nhau?

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "someThing") 
@OnDelete(action = OnDeleteAction.CASCADE) 

Bây giờ tôi đang gặp rắc rối hiểu biết những gì @OnDelete không ở nơi đầu tiên. Hibernate: OnDelete vs cascade=CascadeType.REMOVE thật thú vị, nhưng tiếc là không có bất kỳ câu trả lời nào và JavaDoc cho @OnDelete đặc biệt vô giá trị.

Từ các câu hỏi khác có vẻ như chú thích OnDelete bằng cách nào đó cho phép DB thực hiện xếp tầng, trong khi chỉ thị xếp tầng trên @OneToMany hãy để ORM làm điều đó, nhưng mục đích sử dụng chúng là gì?

Và chỉ thị thác tầng của @OneToMany thực sự không cho phép triển khai ORM tạo ra một chuỗi dựa trên DB không?

Trả lời

8

Hãy nói rằng bạn có một-một quan hệ hướng

class House { 

    @OneToOne 
    Object door; 

} 

Nếu bạn sử dụng CascadeType.REMOVE thì xóa nhà cũng sẽ xóa cửa.

@OneToOne(cascade=CascadeType.REMOVE) 
    Object door; 

Nếu bạn sử dụng @OnDelete thì việc xóa cửa cũng sẽ xóa nhà.

@OneToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    Object door; 

đọc thêm ở đây: http://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete

+2

Các hành vi với một '@ OneToOne' và' @ OneToMany' dường như không được khá giống nhau. Với '@OneToMany (...) @OnDelete (action = OnDeleteAction.CASCADE) Object doors', có vẻ như việc xóa nhà xóa tất cả các cửa của nó, nhưng việc xóa một cánh cửa sẽ không xóa nhà. – Bruno

+0

Nó sẽ phải là '@OneToMany List cửa', tôi nghĩ vậy. Nhưng bên cạnh đó, bản đồ này sẽ không bình thường tạo ra một cột trên bảng House. Bạn có thể có một ánh xạ ngược trên 'Doors.house', hoặc một bảng thu thập. Đối với tầng xếp cơ sở dữ liệu, tôi nghĩ rằng cột phải nằm trong bảng mà bạn muốn xếp vào. –

+0

Không đồng ý. Tôi nghĩ sự khác biệt lớn nhất giữa '' 'CascadeType.REMOVE''' và' '' @ OnDelete''' trong khung nhìn của người dùng là '' '@ OnDelete''' có thể làm việc với JPAQL (vì nó dựa trên DB cascade), nhưng '' 'CascadeType.REMOVE''' không thể làm việc với JPAQL. – okwap

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