使用 Ebean 生成"on delete cascade"



我正在使用 Ebean,我最终需要将"on delete cascade"作为 DDL(数据定义语言) - 哪个注释这样做?我试过了

@OneToMany(cascade=CascadeType.REMOVE)

但这给出了"删除限制"/不会更改默认的"删除限制"?

试试这个

@OneToMany(mappedBy = "parent", cascade = javax.persistence.CascadeType.REMOVE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
你需要

在父类上使用@OnDelete注解,以便Hibernate在DDL中生成它(@OnDelete(action = OnDeleteAction.CASCADE)

例如:

@Entity
class Parent {
   /* id and some attributes */
  @OneToMany(mappedBy = "parent", cascade = {CascadeType.REMOVE})
  @ForeignKey(name = "FK_CHILD_PARENT")
  @OnDelete(action = OnDeleteAction.CASCADE)
  List<Child> children;
}
@Entity
class Child {
   /* id and some attributes */
   Parent parent;
}

虽然你要求"删除级联"作为DDL,但我的答案涵盖了软件级别。eBean 似乎不会生成数据库级别的级联。相反,它处理软件中的级联操作。我认为这是一个很好的选择。

avaje-ebeanorm-4.6.2.jar:com/avaje/ebeaninternal/server/persist/DefaultPersister

 /**
 * Delete the bean.
 * <p>
 * Note that preDelete fires before the deletion of children.
 * </p>
 */
private void delete(PersistRequestBean<?> request) {
    DeleteUnloadedForeignKeys unloadedForeignKeys = null;
    if (request.isPersistCascade()) {
        // delete children first ... register the
        // bean to handle bi-directional cascading
        request.registerDeleteBean();
        deleteAssocMany(request);
        request.unregisterDeleteBean();
    ...

您可以看到,如果请求是级联的,则首先删除其子级(可能这在某种程度上是递归的)。

在我的 postgre DB 中,自动生成的外键约束不包含任何级联,但删除操作仍然是级联的。

最新更新