我还不太清楚cascade在删除操作中的工作方式。我想知道如果我有这个会发生什么:
class myBean{
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Cliente getClienteDiAppartenenza() {
return clienteDiAppartenenza;
}
}
class Cliente{
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
public List<myBean> getMyBeans() {
return myBeans;
}
}
如果我删除带有此属性的myBean,我不确定链接的Cliente是否也会被删除(很多人都很奇怪),或者Cliente中的集合将被更新,myBean的实例被删除,然后保存。
会发生什么事? Hibernato的文档对此并不十分清楚......
答案 0 :(得分:15)
这不是Hibernate的东西,这是JPA 2.0标准的一部分。注释中有两个方面,一个是使用orphanRemoval。
当父实体控制子实体的创建和销毁时,可以使用orphanRemoval。在UML中,这将是一个组合的案例,它是一个强大的所有权和整体的部分的一致寿命。第2.9节:实体关系中的JPA 2.0规范说:
指定为的关联 OneToOne或OneToMany支持使用 orphanRemoval选项。该 以下行为适用于 orphanRemoval生效:
如果从中删除了作为关系目标的实体 关系(通过设置 关系为null或删除 来自关系的实体 集合),删除操作将 适用于实体 而成为孤儿。删除操作是 在冲洗时应用 操作。孤儿撤消 功能适用于实体 他们私下“拥有”的 父实体。便携式应用 否则必须不依赖于 具体的删除顺序,必须 不重新分配已经存在的实体 孤儿或另一种关系孤儿 否则试图坚持下去。如果 孤儿的实体是一个 分离的,新的或删除的实体, orphanRemoval的语义没有 应用
- 醇>
如果将删除操作应用于托管源实体,则删除 操作将级联到 关系目标按照 第3.2.3节的规则,(因此 没有必要指定 cascade = REMOVE for 关系)[20]。
第二个方面是当没有隐含orphanRemoval时使用cascase = REMOVE。
第3.2.3节:删除包含有关删除过程的详细信息:
删除操作的语义, 应用于实体X如下:
•如果X是新实体,则忽略它 通过删除操作。然而 删除操作级联到 X引用的实体,如果是 从X到这些其他人的关系 实体用。注释 cascade = REMOVE或cascade = ALL 注释元素值。
•如果X是托管实体,则删除 操作导致它被删除。 删除操作级联到 X引用的实体,如果是 从X到这些其他人的关系 实体用。注释 cascade = REMOVE或cascade = ALL 注释元素值。
•如果X是一个分离的实体,那么 IllegalArgumentException将是 由删除操作抛出(或者 事务提交将失败)。
•如果X是已移除的实体,则为 被删除操作忽略。
将删除已删除的实体X. 来自数据库之前或之前 事务提交或由于 冲洗操作。经过一个实体 已被删除,其状态(除了 对于生成的状态)将是 在该点的实体 调用删除操作。
答案 1 :(得分:0)
您的JPA提供程序不会为您管理内存中的Java集合。如果您在两侧都映射了关系,那么应该使用非拥有方的映射中的mappedBy属性将一侧定义为拥有方。由你来决定哪一方是拥有方。一旦做出决定,JPA提供商将使用您在映射中定义的任何级联/孤立管理在数据库中保持最新状态,但您只能在非拥有方管理您的集合。
管理此方法的一种方法是使用一个用于进行更改的服务方法,并且该服务方法负责更新1-n和n-1方面的集合或引用,以便您的java对象在记忆中是正确的。