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

sma*_*ufo 10 orm hibernate 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;
}
Run Code Online (Sandbox Code Playgroud)

所有者和数据具有一对一的映射,拥有者是所有者.执行时发生问题:owner.setData(null); ownerDao.update(所有者) ; "Owner"表的Data_id变为null,这是正确的.

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

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

Thi*_*rry 14

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

在@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;
Run Code Online (Sandbox Code Playgroud)

要么

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

编辑:我发现这个SO帖子:Hibernate缺乏对一对一和多对一关系的删除 - 孤儿支持的解决方法?

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

  • 谢谢,它的确有效!并且...不推荐使用CascadeType.DELETE_ORPHAN.它被@OneToOne取代(fetch = FetchType.EAGER,cascade = CascadeType.ALL,orphanRemoval = true) (4认同)
  • FetchType.EAGER似乎对于删除孤儿至关重要。FetchType.LAZY孤立删除操作无效。休眠版本4.3.10.FINAL。 (2认同)