2010-06-14 52 views
6

我有兩個實體,具有以下JPA註解:@OneToOne和@JoinColumn,自動刪除null實體,可以嗎?

@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; 
} 

所有者和數據具有一個一對一映射,持有端是所有者。 當我執行時會發生問題:owner.setData(null); ownerDao.update(所有者); 「所有者」表的Data_id變爲空,這是正確的。

但「數據」行不會自動刪除。我有寫另一個DataDao和另一個服務層來包裝這兩個行動(ownerDao.update(所有者); dataDao.delete(數據);)

是否有可能使一個數據行時自動刪除所有者將其設置爲null?

回答

8

根據您的休眠版本,使用:

使用CascadeType的:DELETE_ORPHAN或orphanRemoval =真在@OneToOne註釋

文檔:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

我從來沒有嘗試過的OneToOne,但從文檔來看,它應該起作用。

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

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

編輯: ,我發現這個職位的SO:Workarounds for Hibernate's lack of delete-orphan support for one-to-one and many-to-one relationships?

所以perhap是它不工作。這兩個答案描述了兩種不同的解決方法。

+2

謝謝,它的作品! And ... CascadeType.DELETE_ORPHAN已棄用。它取代了 @OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL,orphanRemoval = true) – smallufo 2010-06-17 01:33:54

+0

FetchType.EAGER對於孤兒刪除似乎是必不可少的。 FetchType.LAZY孤兒刪除不起作用。休眠版本4.3.10.FINAL。 – 2016-08-24 02:01:02

+0

使用Hibernate 5.0.11.FINAL,這對我來說'@OneToOne(cascade = CascadeType.ALL,orphanRemoval = true)'就足夠了。我成功地使用了'FetchType.LAZY'或'FetchType.EAGER'。 'EAGER'是默認的。 – 2016-12-15 16:02:56