Java 生成";“关于删除级联”;使用Ebean

Java 生成";“关于删除级联”;使用Ebean,java,hibernate,orm,persistence,ebean,Java,Hibernate,Orm,Persistence,Ebean,我使用的是Ebean,我需要最终将“on delete cascade”作为DDL(数据定义语言)——哪个注释会这样做?我试过了 @OneToMany(cascade=CascadeType.REMOVE) 但这会给出“on delete restrict”/不会更改默认的“on delete restrict”?试试这个 @OneToMany(mappedBy = "parent", cascade = javax.persistence.CascadeType.REMOVE) @Casca

我使用的是Ebean,我需要最终将“on delete cascade”作为DDL(数据定义语言)——哪个注释会这样做?我试过了

@OneToMany(cascade=CascadeType.REMOVE)
但这会给出“on delete restrict”/不会更改默认的“on delete restrict”?

试试这个

@OneToMany(mappedBy = "parent", cascade = javax.persistence.CascadeType.REMOVE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
您需要在父类上使用注释,以便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;
}
@实体
班级家长{
/*id和一些属性*/
@OneToMany(mappedBy=“parent”,cascade={CascadeType.REMOVE})
@ForeignKey(name=“FK\u CHILD\u PARENT”)
@OnDelete(action=OnDeleteAction.CASCADE)
列出儿童名单;
}
@实体
班童{
/*id和一些属性*/
父母;
}

尽管您要求将“on delete cascade”作为DDL,但我的回答涵盖了软件级别。EBean似乎不会产生DB级级联。相反,它在软件中处理级联操作。我认为这是一个很好的选择

参见(avaje-ebeanorm-4.6.2.jar:com/avaje/ebeaninternal/server/persist/DefaultPersister)

/**
*删除bean。
*
*请注意,preDelete在删除子项之前激发。
*

*/ 私有void删除(PersistRequestBean请求){ DeleteUnloadedForeignKeys unloadedForeignKeys=null; if(request.isPersistCascade()){ //首先删除子项…注册 //处理双向级联的bean request.registerDeleteBean(); deleteAssocMany(请求); request.unregisterDeleteBean(); ...
您可以看到,如果请求是级联的,那么首先会删除它的子级(可能这是递归的)

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

 /**
 * 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();
    ...