当前位置: 首页 > 面试题库 >

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

齐献
2023-03-14
问题内容

对于删除操作中级联的工作方式,我仍然不太清楚。我想知道如果我有这个会发生什么:

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生效时,将发生以下行为:

1.
如果从关系中移除了作为关系目标的实体(通过将关系设置为null或从关系集合中移除实体),则移除操作将应用于孤立的实体。清除操作在冲洗操作时应用。orphanRemoval功能适用于其父实体“私有”拥有的实体。否则,可移植应用程序不得依赖于特定的删除顺序,并且不得将已孤立的实体重新分配给另一个关系,也不能尝试将其持久化。如果孤立的实体是分离的,新的或已删除的实体,则orphanRemoval的语义不适用。

  1. 如果将删除操作应用于托管源实体,则删除操作将根据3.2.3节的规则级联到关系目标(因此,不必为该关系指定cascade = REMOVE)[
    20]。

第二个方面是在没有隐式删除的情况下使用cascase = REMOVE。

第3.2.3节:删除包含有关删除过程的详细信息:

应用于实体X的remove操作的语义如下:

•如果X是新实体,则删除操作将忽略它。但是,如果从X到这些其他实体的关系用cascade = REMOVE或cascade =
ALL标注元素值标注,则移除操作将层叠到X引用的实体。

•如果X是一个受管实体,则删除操作会使它被删除。如果从X到这些其他实体的关系使用层叠= REMOVE或层叠=
ALL标注元素值标注,则remove操作将层叠到X引用的实体。

•如果X是一个分离的实体,则remove操作将引发IllegalArgumentException(否则事务提交将失败)。

•如果X是已删除的实体,则删除操作将忽略它。

在事务提交之时或之前,或者由于刷新操作,将从数据库中删除已删除的实体X。删除实体后,其状态(生成状态除外)将是实体在调用删除操作时的状态。



 类似资料:
  • 问题内容: 我对级联=“删除”的工作方式感到困惑。我在“城市”映射文件中以以下方式定义了映射: 类客户具有类城市的外键。 因此,当我运行时: 是否还应该删除所有客户端,还是必须以某种方式处理它?我是否将查询作为方法参数正确传递给会话的delete()方法?谢谢你的帮助。最好的问候,混蛋。 问题答案: 我对cascade =“ delete”的工作方式有些困惑(…) 级联操作意味着,如果您是父母,则

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 我是SQL新手,遇到了一个奇怪的问题。所以我有两个表OFFERS和SUPPLIER。这是供应商表。 这是OFFERS表。 所以现在,当我尝试像这样向offers表添加外键约束时 我收到一条错误消息:“ ORA-01735:无效的ALTER TABLE选项”。如果我删除最后一行,即“ ON UPDATE CASCADE”,则可以正常工作。那么,我在做什么错呢?我在互联网上看到了很多类似的

  • 问题内容: 我有以下两个实体: 1-播放列表: *保存或更新播放列表实体时,需要使用 *CascadeType.ALL 来保存和更新PlaylistadMap集合。 orphanRemoval = true :在删除播放列表实体时需要,PlaylistadMap引用也应删除。 2- PlaylistadMap: 使用我删除播放列表时,出现以下异常: 请告知如何解决此异常。 问题答案: 将 Fetc

  • 问题内容: 我收到上述错误“ org.hibernate.ObjectDeletedException:被删除的对象将通过级联重新保存(从关联中删除已删除的对象):”。有人可以帮我这个问题是什么,应该怎么解决? 谢谢。 问题答案: 没有映射结束代码会有点困难…这通常是由于要删除与集合关联的对象引起的。 您必须从拥有的收藏夹中删除对象,然后再删除对象 但是您可以通过这种方式使用deleteOrpha

  • 问题内容: 我的模型与模型有关系。我已指定该关系应级联删除操作。但是,当我查询和删除用户时,出现一个错误,指出仍在引用地址行。如何删除用户和地址? 问题答案: 你有以下… 请注意,在“过滤器”之后,您仍然返回Query对象。因此,当您调用时,您正在调用Query对象(而不是User对象)。这意味着您正在执行批量删除(尽管可能只删除了一行) 您正在使用的方法的文档说… 该方法不提供Python中的级