【问题标题】:JPA firing INSERT before SELECT during an UPDATE?JPA 在 UPDATE 期间在 SELECT 之前触发 INSERT?
【发布时间】:2021-02-01 18:57:55
【问题描述】:

我有一个 Spring JPA 存储库,它正在尝试对实体执行 SELECT。该实体与其父实体有关系:

用户(父)> 地址 > 地址类型(子)

在更新User的过程中,我想添加一个Address。地址有一个字段addressType,它是与AddressType 静态数据表的OneToOne 关系(即地址类型只能是POBOXGeneral),如上所示。 在更新User 的过程中,我添加了一个新的Address 并使用传入的User+Address DTO 中传入的addressType 执行地址类型的findByName

但是,当我在 AddressType 的 JPA 存储库上执行 findByName 时 - IT 尝试首先在父 Address 上执行 INSERT。这样做会导致 IntegrityViolationException,因为第一次插入 Address 而没有 AddressType 这是一个必填字段。我在这里对 SO 进行了一些研究,发现一些线程表明这可能是 entitymanager 的一种行为,它以某种方式声明 Address 被添加为脏。

我的问题是 - 如何防止父 Address 上的 INSERT 以便 AddressType 上的 SELECT 自行发生?

【问题讨论】:

  • 在完成地址类型查找之前不要添加地址/用户。只有在确定完成后才向 PersistenceUnit/Transaction 添加一些内容,直到您设置了 AddressType 参考。

标签: hibernate jpa spring-data-jpa


【解决方案1】:

这是 JPA 的正常刷新行为。当您更改由 JPA 管理的实体时,这些更改会在执行查询之前刷新到数据库中。

您确实通过向其添加Address 来更改User 实体。

要解决这个问题,仅在 Address 完全构建时添加它,即它的 AddressType 已设置。

注意:我确定这是重复的,但我找不到。但是有一个密切相关的问题:JPA auto flush before any query

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多