问题描述
|||
对于删除操作中级联的工作方式,我仍然不太清楚。我想知道如果我有这个会发生什么:
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的文档对此不太清楚...
解决方法
这不是Hibernate,这是JPA 2.0标准的一部分。注释中有两个方面,一件事是使用orphanRemoval。
当父实体控制子实体的创建和销毁时,可以使用orphanRemoval。在UML中,这是组成的情况,这是整个部分的强大所有权和一致的生命周期。 JPA 2.0规范在第2.9节:实体关系中说:
指定为的关联
OneToOne或OneToMany支持使用
orphanRemoval选项。的
以下行为适用于
orphanRemoval生效:
如果从关系中移除了作为关系目标的实体
关系(通过设置
与null的关系或删除
关系中的实体
集合),则删除操作将
适用于
成为孤儿。删除操作是
在冲洗时使用
操作。孤儿搬迁
功能适用于实体
由他们私人“拥有”
父实体。便携式应用
否则必须不依赖于
具体移除顺序,并且必须
不重新分配已经
成为另一个关系的孤儿或
否则,尝试将其保留。如果
被孤立的实体是
分离的,新的或已删除的实体,
orphanRemoval的语义不
应用。
如果将删除操作应用于托管源实体,则删除
操作将级联到
关系目标符合
3.2.3节的规则(因此
没有必要指定
级联=删除
关系)[20]。
第二个方面是在没有隐式删除的情况下使用cascase = REMOVE。
第3.2.3节:删除包含有关删除过程的详细信息:
删除操作的语义,
应用于实体X的方法如下:
•如果X是新实体,则将其忽略
通过删除操作。然而
删除操作级联到
X引用的实体,如果
从X到其他的关系
实体用
级联=删除或级联=全部
注释元素值。
•如果X是管理实体,则删除
操作导致将其删除。
删除操作级联为
X引用的实体,如果
从X到其他的关系
实体用
级联=删除或级联=全部
注释元素值。
•如果X是独立实体,则
IllegalArgumentException将是
由remove操作(或
事务提交将失败)。
•如果X是已删除的实体,则为
由remove操作忽略。
移除的实体X将被移除
在数据库之前或之前
事务提交或由于
冲洗操作。在实体之后
已被删除,其状态(除
对于生成状态)将是
实体在
调用了删除操作。
, 您的JPA提供者不会为您管理内存中的Java集合。如果您在双方之间都映射了关系,则应使用非拥有方的映射中的maptedBy属性将一方定义为拥有方。由您决定哪一方是拥有方。做出决定后,JPA提供程序将使用您在映射中定义的任何级联/孤立管理来使数据库中的信息保持最新,但是您将不得不在非所有者方管理集合。
解决此问题的一种方法是拥有一个用于进行更改的服务方法,该服务方法负责在事物的1-n和n-1侧更新集合或引用,以便您的java对象正确无误。记忆。