12

我有两个实体,带有以下 JPA 注释:

@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 和 Data 是一一对应的,拥有方是 Owner。当我执行时出现问题:owner.setData(null) ; ownerDao.update(owner) ; “所有者”表的 Data_id 变为 null ,这是正确的。

但“数据”行不会自动删除。我必须编写另一个 DataDao 和另一个服务层来包装这两个操作( ownerDao.update(owner) ; dataDao.delete(data); )

当拥有所有者将其设置为 null 时,是否可以自动删除数据行?

4

1 回答 1

19

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

在 @OneToOne 注释上使用 cascadeType : DELETE_ORPHAN 或 orphanRemoval=true

文档: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 帖子:Hibernate 缺乏对一对一和多对一关系的删除孤儿支持的解决方法?

所以也许它不起作用。然而,这两个答案描述了两种不同的解决方法。

于 2010-06-14T09:38:40.267 回答