【问题标题】:JPA 2.0 native annotations for cascading deletes of a one-way relationship用于级联删除单向关系的 JPA 2.0 本机注释
【发布时间】:2012-11-02 05:08:10
【问题描述】:

这个问题与this 有关,因为我在孩子和父母之间有一个单向的@ManyToOne 关系。有数十万个子条目,我不希望父级与子级有@OneToMany 关系。

除了删除父级是不可能的之外,一切都很好,除非我先删除子级,我希望通过ON DELETE CASCADE 轻松实现 Postgres 提供的功能。我正在使用 Postgres 9。我也在使用 JPA 2.0/Hibernate 4.1.7。

我目前正在使用Hibernate的自动DDL创建功能,因为我经常移动东西,所以我不想在表格上手动添加ON DELETE CASCADE,因为它们将在下一轮我被删除做一些改变。

有什么方法可以将ON DELETE CASCADE 约束/触发器作为JPA @ManyToOne 注释的一部分放在子实体中?这样数据库就自动正确创建了。

【问题讨论】:

  • JPA 标准 @OneToMany(..., orphanRemoval=true) 是正常的解决方案 (stackoverflow.com/q/306144/398670)。你不能/不想使用它,所以你正在寻找替代品。对吗?
  • OP 询问 @ManyToOne 并特别避免添加逆 @OneToMany...
  • @CraigRinger 不,我不想使用@OneToMany。就我而言,我经常有数百万行与父级关联。我从来不需要让所有孩子都成为父母自上而下的情况。我不想为这种情况添加@OneToMany
  • 我是这么想的;我想确认这一点,并明确“记录在案”对于发现此问题的其他人来说,标准方法是什么。

标签: java hibernate postgresql jpa jpa-2.0


【解决方案1】:

使用 JPA 注释,不。但是 Hibernate 有@org.hibernate.annotations.OnDelete

    @ManyToOne
    @JoinColumn
    @OnDelete( action = OnDeleteAction.CASCADE )
    private Parent parent;

EG 正在讨论在 JPA 2.1 中添加类似的内容

【讨论】:

  • 您知道将 ON DELETE CASCADE 添加到 @JoinColumn 的 columnDefinition 字段是否也可以解决问题吗?
  • 实际上我看了更多,@OnDelete 目前仅支持收集端,而不是(甚至单向的)多对一端。对于那个很抱歉。不,使用 columnDefinition 将不起作用,因为 columnDefinition 以列定义为目标,而 ON DELETE 行为是外键的一部分。目前,您必须手动将其切换为工作。我将使用适当的代码示例更新我的答案...
  • 嗨,我今天早上按照您的建议尝试了@OnDelete,实际上将 hbm2ddl.auto 设置为创建(它似乎不适用于更新)它工作正常。正如我希望的那样,它在孩子的外键约束上创建了一个 ON DELETE CASCADE 触发器。所以似乎对我有用 @ManyToOne
  • 是的,你是对的。我只是偏离了描述。我自己试过了,它也对我有用。
  • 然而,我遇到的一个问题是它非常非常慢。我怀疑它是因为 FK 本身没有索引。你知道是否还有另一个 Hibernate 注释也强制 @ManyToOne 有一个索引? JPA 似乎也没有 :(
猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 2022-10-07
  • 1970-01-01
  • 2021-10-18
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多