是否可以暂时禁用 Hibernate 实体的级联?
Is it possible to temporarily disable cascading for a Hibernate entity?
给定一个 Hibernate/JPA 实体,相关实体的级联设置为 ALL
:
@Entity
public class Entity {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "entity")
private Set<RelatedEntities> relatedEntities;
}
是否可以暂时关闭级联,例如允许实体在不持久化其相关实体的情况下持久化?
您不能暂时禁用级联(至少据我所知),但由于您使用 Hibernate,您可以 insert new entity using HQL
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
总是有一个"manual"的解决方案,你把relatedEntities
记在一个变量中以备后用,并在持久化之前将null
值设置为它在Entity
实例上的值它。
不,做不到,至少依我的小见,这样做也不是什么好事。当其他开发人员查看映射和执行 persist/merge/delete 的代码时......他们会期望应用级联并引入意外行为,如果他们监督级联在其他地方暂时禁用他们所关注的代码改变。
但是,您可以将没有级联字段的新实体 class 映射到同一个 table。然后在您不希望应用级联的情况下使用该实体。
给定一个 Hibernate/JPA 实体,相关实体的级联设置为 ALL
:
@Entity
public class Entity {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "entity")
private Set<RelatedEntities> relatedEntities;
}
是否可以暂时关闭级联,例如允许实体在不持久化其相关实体的情况下持久化?
您不能暂时禁用级联(至少据我所知),但由于您使用 Hibernate,您可以 insert new entity using HQL
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
总是有一个"manual"的解决方案,你把relatedEntities
记在一个变量中以备后用,并在持久化之前将null
值设置为它在Entity
实例上的值它。
不,做不到,至少依我的小见,这样做也不是什么好事。当其他开发人员查看映射和执行 persist/merge/delete 的代码时......他们会期望应用级联并引入意外行为,如果他们监督级联在其他地方暂时禁用他们所关注的代码改变。
但是,您可以将没有级联字段的新实体 class 映射到同一个 table。然后在您不希望应用级联的情况下使用该实体。