Hibernate不添加';删除级联';

Hibernate不添加';删除级联';,hibernate,Hibernate,使用cascade=CascadeType.REMOVEhibernate不会在表生成期间添加“ON DELETE cascade”。这是正确的行为吗?如果我对父对象执行em.remove(),没有问题,但当我尝试通过HQL执行批量删除时,会出现错误 PostgreSQL 9.1、Hibernate 4.0.0.CR7这是预期的行为。cascade注释告诉Hibernate级联删除,这是Hibernate的责任,而不是数据库的责任 批量删除查询完全绕过会话和实体级联注释。当您选择使用它们时,您必

使用
cascade=CascadeType.REMOVE
hibernate不会在表生成期间添加“ON DELETE cascade”。这是正确的行为吗?如果我对父对象执行em.remove(),没有问题,但当我尝试通过HQL执行批量删除时,会出现错误


PostgreSQL 9.1、Hibernate 4.0.0.CR7这是预期的行为。cascade注释告诉Hibernate级联删除,这是Hibernate的责任,而不是数据库的责任


批量删除查询完全绕过会话和实体级联注释。当您选择使用它们时,您必须自行处理级联删除。

这是预期的行为。cascade注释告诉Hibernate级联删除,这是Hibernate的责任,而不是数据库的责任


批量删除查询完全绕过会话和实体级联注释。当您选择使用它们时,您必须自行处理级联删除。

我的理解是,您所指的“ON DELETE cascade”功能是一个数据库触发器。Hibernate不配置触发器。使用注释,Hibernate将使用标准的SELECT和DELETE语句管理子对象的删除。如果打开调试,您将看到这种情况发生。当您第一次开始使用hibernate时,这看起来非常低效,因此您希望通过您所指的HQL使用批量删除

所以表生成不会添加特定于数据库的特性,比如触发器。如果希望能够删除子对象,请根据需要尝试类似的操作

@OneToMany(cascade={CascadeType.ALL}, orphanRemoval=true)
private List<Case> cases = new ArrayList<Case>();
@OneToMany(cascade={CascadeType.ALL},orphanRemoving=true)
私有列表案例=新的ArrayList();
当直接使用HQL时,它会绕过级联逻辑,因此您可能必须编写自己的“清理”代码,定期运行以清理或隐藏等。为了提高效率,我选择为此编写一个存储过程


另一种方法是检索要删除的父对象的集合并逐个循环。如果您的集合很大,则这不是有效的,但至少会按照您在注释中的定义进行级联。

我的理解是,您所指的“删除级联”功能是一个数据库触发器。Hibernate不配置触发器。使用注释,Hibernate将使用标准的SELECT和DELETE语句管理子对象的删除。如果打开调试,您将看到这种情况发生。当您第一次开始使用hibernate时,这看起来非常低效,因此您希望通过您所指的HQL使用批量删除

所以表生成不会添加特定于数据库的特性,比如触发器。如果希望能够删除子对象,请根据需要尝试类似的操作

@OneToMany(cascade={CascadeType.ALL}, orphanRemoval=true)
private List<Case> cases = new ArrayList<Case>();
@OneToMany(cascade={CascadeType.ALL},orphanRemoving=true)
私有列表案例=新的ArrayList();
当直接使用HQL时,它会绕过级联逻辑,因此您可能必须编写自己的“清理”代码,定期运行以清理或隐藏等。为了提高效率,我选择为此编写一个存储过程


另一种方法是检索要删除的父对象的集合并逐个循环。如果您的集合很大,这不是有效的,但至少会按照您在注释中的定义进行级联。

您要查找的是影响hibernate生成架构(DDL语句)的
@OnDelete
注释。但是,如果数据库中的外键定义中没有关于删除级联的
子句,则在批量删除的情况下,此注释不会将删除级联到引用实体/行

@OneToMany
@OnDelete(action=OnDeleteAction.CASCADE)
public Set<Stuff> getStuff() {
  return stuff;
}
@OneToMany
@OnDelete(action=OnDeleteAction.CASCADE)
公共集getStuff(){
归还物品;
}

您要查找的是影响hibernate模式生成(DDL语句)的
@OnDelete
注释。但是,如果数据库中的外键定义中没有关于删除级联的
子句,则在批量删除的情况下,此注释不会将删除级联到引用实体/行

@OneToMany
@OnDelete(action=OnDeleteAction.CASCADE)
public Set<Stuff> getStuff() {
  return stuff;
}
@OneToMany
@OnDelete(action=OnDeleteAction.CASCADE)
公共集getStuff(){
归还物品;
}

Hibernate会让我发疯的@OnDelete在@OneToMany上工作,但在@OneToOne上不工作!此外,它不便于携带。当
CASCADE=CascadeType.REMOVE
时,其他ORM是否在DELETE CASCADE
上应用
?@tscho知道如何实现一对一映射吗???@Sikorski我使用
@OneToOne
映射工作得很好。使用hibernate 4.2.1.hibernate会让我发疯@OnDelete在@OneToMany上工作,但在@OneToOne上不工作!此外,它不便于携带。当
CASCADE=CascadeType.REMOVE
时,其他ORM是否在DELETE CASCADE
上应用
?@tscho知道如何实现一对一映射吗???@Sikorski我使用
@OneToOne
映射工作得很好。使用Hibernate4.2.1。