hibernate - JPA 在 UPDATE 期间在 SELECT 之前触发 INSERT?
问题描述
我有一个 Spring JPA 存储库,它试图在实体上执行 SELECT。该实体与其父实体有关系,因此:
用户(父)> 地址 > 地址类型(子)
在更新的过程中User
,我想添加一个Address
。地址有一个字段addressType
,它是与静态数据表的 OneToOne 关系AddressType
(即地址类型只能是POBOX
或General
),如上所示。在 UPDATING 的过程中User
,我正在添加一个新的Address
并使用来自传入DTOfindByName
的传入 addressType 的 AddressType 。User+Address
但是,当我findByName
在 AddressType 的 JPA 存储库上执行操作时 - IT 尝试首先在父项上执行 INSERT Address
。这样做会导致 IntegrityViolationException,因为首先插入 Address 而没有AddressType
强制字段。我在这里对 SO 进行了一些研究,发现一些线程表明这可能是 entitymanager 的一种行为,它以某种方式声明Address
被添加为脏。
我的问题是-如何防止父级上的 INSERT 以Address
使 SELECTAddressType
自行发生?
解决方案
这是 JPA 的正常刷新行为。当您更改由 JPA 管理的实体时,这些更改会在执行查询之前刷新到数据库中。
您确实User
通过添加一个实体来更改Address
它。
要解决这个问题,Address
只有在它完全构建时才添加,即它AddressType
已设置。
注意:我确定这是重复的,但我找不到。但是有一个密切相关的问题:JPA auto flush before any query