使用Hibernate/JPA可以“不加选择地更新”吗?

2022-09-02 22:43:06

因此,使用JPA / Hibernate,您当然可以加载实体“代理”,而无需使用类似或之类的东西来命中数据库。session.load()entityManager.getReference()

但是,如果不Hibernate从数据库初始化代理,似乎不可能在这些“代理”上设置属性。因此,不能在没有选择的情况下仅保留已更改的值(通过实体)。@DynamicUpdate

我相信这就是它的方式,如果你愿意,你必须自己滚动它。如果有人能证明我错了,我会很高兴!我错过了什么吗?update without select


答案 1

恐怕你是对的,正如@DynamicUpdate的java-doc中所写的那样:“注意,对于分离实体的重新附加,如果不启用更新前选择,这是不可能的。

nicolasl给出的答案对于这种情况是不正确的,如果您希望控制在使用CrudRepository时是否触发持久化或合并,则需要实现持久化。


答案 2

AFAIK 选择由合并操作执行,其唯一目的是检查实体是否已存在于数据库中。如果这是正确的,您可以实现自己的验证,就像他们在文档中所说的那样:

实现持久化:如果实体实现持久化,则Spring Data JPA会将新检测委托给实体的isNew(...)方法。有关详细信息,请参阅 JavaDoc。

实现 EntityInformation:您可以通过创建 JpaRepositoryFactory 的子类并相应地覆盖 getEntityInformation(...) 方法,自定义 SimpleJpaRepository 实现中使用的 EntityInformation 抽象。然后,您必须将 JpaRepositoryFactory 的自定义实现注册为 Spring Bean。请注意,这应该很少需要。有关详细信息,请参阅 JavaDoc。

(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.entity-persistence.saving-entites)

我从来没有实现过这样的事情,但我想你可以试一试......

希望这对您有所帮助

干杯

尼考


推荐