2

如何使用 JPA/Hibernate 自动删除 OneToOne 项目?我希望在包含的类中简单地将 OneToOne 项设置为 null 会足够聪明以允许 Hibernate 删除它。

给定一个简单的对象,简化:

@Entity
public class Container {
    private Item item;

    @OneToOne(cascade=CascadeType.ALL)
    public Item getItem() { return item; }

    public void setItem(Item newItem) { item = newItem; }
}

当在 Container 上设置 Item 时,Container 通过合并持久化,插入一行。

Container container = new Container();
container.setItem(new Item());
container = entityManager.merge(container);
// Row count is 1

但是当该项设置为空,或者设置为另一个项时,旧的对象仍然存在于表中。

container.setItem(null);
container = entityManager.merge(container);
// Row count is STILL 1, leaving orphaned rows.

那么,如何删除这些 OneToOne 孤儿?

4

4 回答 4

1

猜想hibernate不允许关系背后的原因与DELETE_ORPHAN这个问题有关。OneToOne

如果你真的想要这个坏的,你可以通过以下步骤破解你的方式:

  • 将您的OneToOne关系转换为OneToMany
  • 添加一个方法来获取子集合的第一个元素(这是可选的,但很方便)
  • 使用DELETE_ORPHAN注释

当然,这是一个很大的hack。

于 2009-12-17T17:44:43.557 回答
0

尝试更改为

@OneToOne
@Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN})

另请参阅我对类似帖子的回答

于 2009-04-02T10:55:31.373 回答
0

不幸的是,如果不将自己绑定到 Hibernate 的实现,就无法在 JPA 中执行此操作。

所以是的,正如 Foxy 所说,您可以使用org.hibernate.annotations.CascadeType而不是标准 JPA 注释,它允许您指定DELETE_ORPHAN. 如果您想使用 JPA 抽象,您必须自己删除孤儿。

于 2009-04-02T11:06:10.583 回答
0

由于 JPA 2.0 已经发布了很长时间,您可以简单地使用:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
于 2019-05-27T06:25:53.030 回答