首页 > 解决方案 > JPA 在 UPDATE 期间在 SELECT 之前触发 INSERT?

问题描述

我有一个 Spring JPA 存储库,它试图在实体上执行 SELECT。该实体与其父实体有关系,因此:

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

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

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

我的问题是-如何防止父级上的 INSERT 以Address使 SELECTAddressType自行发生?

标签: hibernatejpaspring-data-jpa

解决方案


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

您确实User通过添加一个实体来更改Address它。

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

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


推荐阅读