删除子项时,JPA 关系不会更新

2024-04-02

假设有以下场景:

@Entity
public class A {
  @OneToMany(mappedBy = "a", cascade = CascadeType.ALL)
  private List<B> bList;
}

@Entity
public class B {
  @ManyToOne()
  @JoinColumn(name = "a_id", referencedColumnName = "id")
  private A a;

  @ManyToOne()
  @JoinColumn(name = "c_id", referencedColumnName = "id")
  private C c;
}

@Entity
public class C {
  @OneToMany(mappedBy="c", cascade=CascadeType.ALL, orphanRemoval=true)
  @CascadeOnDelete // eclipselink specific optimization annotation
  private List<B> bList;
}

换句话说:对象A和对象C都包含多个B对象。

当我删除一个 C 对象时(从技术上讲,我正在更新一个包含多个 C 对象并使用孤儿删除的对象),我希望删除所有引用的 B 对象,这可以按当前注释的预期工作。然而,实体管理器似乎不明白位于其缓存中的对象 A 现在已经丢失了一些子对象。如果我有一个 A 的实例,我当然必须手动更新它的 bList,或者执行一个新的查询来更新它,但即使是新获取的 A 对象仍然是过时的。重申一下:

  • C 对象被删除。
  • 删除通过 orphanRemoval 级联到 B 对象。
  • 实体管理器中缓存的 A 对象中的 bList 是未更新.
  • 手动清除实体管理器缓存可以使其检索正确更新的对象。

如何解决这个问题?我希望实体管理器自动更新其持久性上下文,或者在 @JoinColumn 上提供级联注释,但这里似乎都不是这种情况。

编辑:问题似乎在于对象 C 的 bList 在更新对象 A 的 bList 时未更新(因此无法级联更改)。但我不知道为什么......仍然请注意,我正在谈论持久性上下文而不是实例化对象。


JPA 不会为您维护关系,应用程序必须维护它们。这意味着当您删除一个实体时,应用程序负责清除对该实体的任何引用。当它是外键关系时,这一点很明显,因为如果不这样做,数据库约束通常会导致异常。在反向引用的情况下,虽然关系没有严格的数据库约束,但用户通常会错误地认为 JPA 会处理它 - 导致缓存损坏。

处理它的方法是删除对 C 和 B 实体的任何引用。在您的对象模型中,这意味着修复 A 的 bList 以删除 B。我已经看到这是通过实体删除事件或在应用程序代码中处理的。由于在这种情况下,A 没有外键,因此您还可以在删除发生后(即刷新或提交后)从数据库刷新受影响的 A 实体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除子项时,JPA 关系不会更新 的相关文章

  • 默默忽略remove()

    实体 A 引用 多对一 实体 B 具有从 B 到 A 的反向 映射 引用 此外 还存在 A 到 C 的引用以及 C 到 A 的反向引用 当我发出entityManager remove A 然后flush 时 不会生成 删除 但也没有例外
  • EclipseLink 合并意外级联

    我有两个实体类用户和设备 用户实体 public class User private Long userId OneToMany mappedBy userId fetch FetchType LAZY private Collectio
  • Spring Boot + JPA2 + Hibernate - 启用二级缓存

    我使用 Spring Boot 1 2 5 和 JPA2 来注释实体 并将 hibernate 作为底层 JPA 实现 我想在该设置中使用二级缓存 因此实 体被注释为 javax persistence Cacheable 我还在 appl
  • 将 Glassfish v2 升级到 JPA 2.0?

    我尝试在 Glassfish V2 上将 Hibernate 3 5 5 与 Spring HibernateJpaVendorAdapter 一起使用 但在初始化 Spring 上下文时出现以下异常 java lang NoSuchMet
  • 具有自定义默认值的 EclipseLink JPA 主键

    我的 SQL Server 数据库中有一个表 其中主键字段定义为NEWID 作为默认值 期望客户端不需要传递主键字段值 SQL Server 将处理它 在 JPA 定义模型类时 我必须使用生成类型定义此 ID 字段 我试过IDENTITY
  • 当属性是对象时命名查询?

    我想在 JPA 中进行此查询 SELECT FROM happyDB users U WHERE U party as user 1 AND U party party id 2 这工作正常 但我的问题是我有Party只能作为一个对象 而不
  • 删除子项时,JPA 关系不会更新

    假设有以下场景 Entity public class A OneToMany mappedBy a cascade CascadeType ALL private List b bList Entity public class B Ma
  • @XmlPath 在 JAXB 编组期间没有影响

    我正在尝试使用创建 XMLJaxB Marshalling方法 我想跳过某些子项的父标签 或者可能添加新的XML某个元素的父标签 因此我尝试使用 XmlPath from import org eclipse persistence oxm
  • 如何在jpa监听器中获取实体管理器或事务

    我正在使用 Hibernate 事件侦听器 例如PostDeleteEventListener PostInsertEventListener PostUpdateEventListener在插入 删除和更新期间执行一些操作 现在我想使用
  • 为什么 JPA 更新 OrderColumn 而不是在创建时设置它?

    我想在 OrderColumn 上的表中添加 NOT NULL 约束 使用约束运行我的代码时出现约束违规错误 在没有约束的情况下运行 我发现该行首先在没有 OrderColumn 的情况下插入 然后立即使用正确的 OrderColumn 进
  • JPA/Hibernate - 与子实体一起分离实体

    我使用 JPA 2 和 Hibernate 3 6 8 作为实现 假设我们有一个实体Foo Entity public class Foo OneToOne private Bar bar 我需要将整个实体图从会话中分离出来 当我这样做时e
  • JPA 和 eclipselink - 重写 FetchType.Eager

    我有一个类 其中一些成员有注释 ManyToOne fetch FetchType EAGER 在我的程序的特定部分中 这些加载了太多的数据 不幸的是 我无法更改这些注释 因为这会影响该程序其他部分的性能 eclipselink 中有没有办
  • 无法在 Eclipselink 上合并日期

    我的会话 bean 不会对托管实体执行更新 我已经包含了相关类的代码 当我使用 prime faces 计划组件修改事件的日期字段并将修改后的实体传递给会话 bean 并调用 em merge event 时 实体管理器不会尝试更新实体 并
  • Spring 3.1 和 JPA 2 没有正在进行的事务异常

    我已经这样做了几个星期了 我已经尝试过 eclipselink 现在只是普通的 JPA 我不断遇到同样的问题 每次我尝试刷新实体管理器时 都会收到 javax persistence TransactionRequiredException
  • JPA 2.0 API Maven 工件

    我正在使用 JPA 2 0 我的持久性提供程序是 Hibernate 但是 我只想包含 javax 中的标准 API 但在中心 没有 2 0 工件 我目前正在使用 Hibernate JPA 2 0 工件 但我想使用更标准的东西 这可能吗
  • IntelliJ 无法识别 JPA 静态元模型

    我使用 JHipster 生成应用程序 并使用 Gradle 作为构建工具 当我创建实体时 我添加了过滤支持 这会生成 JPA 静态元模型 但 IntelliJ 无法识别元模型 我已经在 IntelliJ 上启用了注释处理器设置 但它似乎不
  • 必须管理实体才能调用删除

    这里发生了什么 Stateless LocalBean public class AppointmentCommentDao public void delete long appointmentCommentId AppointmentC
  • 批量获取在 EclipseLink 中不起作用

    考虑这个简单的关联 Entity public class Employee OneToMany fetch FetchType LAZY private Set
  • EclipseLink MOXy:XmlPath 注释中的逻辑运算符

    逻辑运算符在 EclipseLink MOXy 的 XmlPath 注释中工作吗 我尝试过但无法使其工作 没有抛出异常 并且没有任何内容绑定到 元素 例如 我想在绑定文件中包含如下内容
  • JPA Criteria查询Path.get left join是否可以

    我对 JPA 标准有疑问 这是我的 JPA 标准查询 CriteriaBuilder criteriaBuilder getEm getCriteriaBuilder CriteriaQuery

随机推荐