【问题标题】:How to cascade delete entities with unidirectional 'ManyToOne' relationship with JPA如何级联删除与 JPA 具有单向“多对一”关系的实体
【发布时间】:2013-11-06 17:42:16
【问题描述】:

我有两个实体类“用户”和“部门”,具有单向“多对一”关系,如下所示。

public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "DEPARTMENT_ID", nullable = true)
    private Department department;
}

public class Department{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

如果我想删除一些用户并级联删除引用的部门,如果没有任何用户引用该部门,请问JPA有什么功能可以使用吗?

【问题讨论】:

  • 你的问题解决了吗?

标签: java hibernate jpa cascade openjpa


【解决方案1】:

你可以告诉休眠删除“孤儿”条目;

@Cascade({ org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })

【讨论】:

    【解决方案2】:

    您可以使用CascadeType.DELETE,但是此注释仅适用于EntityManager 中的对象,而不适用于数据库。您要确保将ON DELETE CASCADE 添加到数据库约束中。要进行验证,您可以配置 JPA 以生成 ddl 文件。查看ddl 文件,您会注意到ON DELETE CASCADE 不是约束的一部分。将ON DELETE CASCADE 添加到ddl 文件中的实际SQL,然后从ddl 更新您的数据库架构。这将解决您的问题。

    这个link 展示了如何在 MySQL 中为CONSTRAINT 使用ON DELETE CASCADE。您在约束上执行此操作。您也可以在 CREATE TABLEALTER TABLE 语句中执行此操作。 JPA 很可能在 ALTER TABLE 语句中创建了约束。只需在该语句中添加ON DELETE CASCADE

    请注意,一些 JPA 实现者确实提供了实现此功能的方法。

    Hibernate 确实使用 @OnDelete 注释提供此功能。

    【讨论】:

    • 非常感谢您的热情回复。但是很抱歉我们不允许在数据库层实现这个,只能使用标准的JPA来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多