我正在使用 Ebean,我最终需要将“删除级联”作为 DDL(数据定义语言) - 哪个注释可以做到这一点?我试过了
@OneToMany(cascade=CascadeType.REMOVE)
但这给出了“删除限制”/不会更改默认的“删除限制”?
我正在使用 Ebean,我最终需要将“删除级联”作为 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 中,自动生成的外键约束不包含任何级联,但删除操作仍然是级联的。