2010-06-14 34 views
6

Tôi có hai thực thể, với chú thích JPA sau:@OneToOne và @JoinColumn, tự động xóa thực thể rỗng, có thể thực hiện được?

@Entity 
@Table(name = "Owner") 
public class Owner implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL) 
    @JoinColumn(name="Data_id") 
    private Data Data; 
} 

@Entity 
@Table(name = "Data") 
public class Data implements Serializable 
{ 
    @Id 
    private long id; 
} 

Chủ đầu tư và dữ liệu có one-to-one lập bản đồ, phía sở hữu là chủ đầu tư. Sự cố xảy ra khi tôi thực thi: owner.setData (null); ownerDao.update (chủ sở hữu); Data_id của bảng "Chủ sở hữu" trở thành null, đúng vậy.

Nhưng hàng "Dữ liệu" sẽ không bị xóa tự động. Tôi phải viết một DataDao khác và một lớp dịch vụ khác để bọc hai hành động đó (ownerDao.update (chủ sở hữu); dataDao.delete (dữ liệu);)

Có thể thực hiện một hàng dữ liệu tự động bị xóa khi sở hữu Chủ sở hữu thiết lập nó để null?

Trả lời

8

Tùy thuộc vào phiên bản Hibernate của bạn, sử dụng:

sử dụng cascadeType: DELETE_ORPHAN hoặc orphanRemoval = true vào chú thích @OneToOne

tài liệu: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

Tôi chưa bao giờ thử nó trên OneToOne, nhưng từ tài liệu, nó sẽ hoạt động.

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL) 
@JoinColumn(name="Data_id") 
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
private Data Data; 

hoặc

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true) 
@JoinColumn(name="Data_id") 
private Data Data; 

EDIT: tôi thấy điều này SO bài: Workarounds for Hibernate's lack of delete-orphan support for one-to-one and many-to-one relationships?

Vì vậy, perhap là nó không làm việc. Hai câu trả lời mô tả hai cách giải quyết khác nhau tuy nhiên.

+2

Cảm ơn bạn, nó hoạt động !!! Và ... CascadeType.DELETE_ORPHAN không được chấp nhận. Nó được thay thế bằng @OneToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) – smallufo

+0

FetchType.EAGER rất cần thiết cho việc loại bỏ trẻ mồ côi. Loại bỏ FetchType.LAZY mồ côi không hoạt động. Phiên bản Hibernate 4.3.10.FINAL. –

+0

Sử dụng Hibernate 5.0.11.FINAL, điều này là đủ cho tôi '@OneToOne (cascade = CascadeType.ALL, orphanRemoval = true)'. Tôi đã thành công bằng cách sử dụng 'FetchType.LAZY' hoặc' FetchType.EAGER'. 'EAGER' là mặc định. –

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