@OneToOne和@JoinColumn,自动删除null实体,可行吗?

时间:2010-06-14 05:48:06

标签: hibernate orm jpa one-to-one

我有两个实体,其中包含以下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.setData(null); ownerDao.update(所有者); “Owner”表的Data_id变为null,这是正确的。

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

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

1 个答案:

答案 0 :(得分:12)

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

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

编辑: 我找到了这个帖子:Workarounds for Hibernate's lack of delete-orphan support for one-to-one and many-to-one relationships?

所以perhap是不行的。这两个答案描述了两种不同的解决方法。