Hibernate/JPA是否支持“无选择更新”?

18
使用JPA/Hibernate,您可以使用session.load()entityManager.getReference()等方法加载实体“代理”而不触及数据库。
然而,似乎无法在这些“代理”上设置属性,而不初始化与数据库的代理。因此,您无法仅通过更改值(通过实体上的@DynamicUpdate)持久化它们,而无需进行选择查询。
我认为这就是现状,如果您想要update without select,则必须自己制作。如果有人能证明我错了,我会很高兴!我错过了什么吗?

1
在我看来,真正的问题(也许您也是这么想)不是“如何在不进行选择的情况下更新”,而是“如何以符合JPA哲学的方式进行更新”。我想说,有一些方法存在,但会破坏缓存、会话或@PrePersist java代码。为了更好的讨论,可以查看来自https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html的第13.3节(请参见“免责声明”,这是我的思路)。很好的问题,我的“点赞”。 - Jacek Cz
你能否说一下你是否找到了解决方案? - Pavel_K
2个回答

2

恐怕你是正确的,正如@DynamicUpdate的Java-doc中所写: “注意,对于重新附加分离的实体,如果没有启用select-before-update,则无法进行更新。”

nicolasl给出的答案对于这种情况是不正确的,如果你希望在使用CrudRepository.save()时控制触发persist或merge,则需要实现Persistable。


-1

据我所知,选择操作是通过合并操作执行的,其唯一目的是检查实体是否已存在于您的数据库中。如果是这样,您可以按照他们在文档中所说的实现自己的验证:

实现Persistable:如果一个实体实现了Persistable,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)

我从未实现过这样的东西,但我猜你可以试一试...

希望这能帮到你

祝好

Nikao


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接