@ManyToOne JPA关联和级联…不确定删除对象会发生什么情况

问题描述

||| 对于删除操作中级联的工作方式,我仍然不太清楚。我想知道如果我有这个会发生什么:
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对象正确无误。记忆。