【发布时间】:2021-02-01 18:57:55
【问题描述】:
我有一个 Spring JPA 存储库,它正在尝试对实体执行 SELECT。该实体与其父实体有关系:
用户(父)> 地址 > 地址类型(子)
在更新User的过程中,我想添加一个Address。地址有一个字段addressType,它是与AddressType 静态数据表的OneToOne 关系(即地址类型只能是POBOX 或General),如上所示。
在更新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