gpt4 book ai didi

java - 如何使HSQL在更改实体字段时不自动更新实体

转载 作者:行者123 更新时间:2023-11-30 05:56:17 25 4
gpt4 key购买 nike

我有一个实体,每当我编辑其字段时,HSQL 都会立即更新该实体。

下面的代码

System.out.println(userService.findById(user.getId()).getPassword());

user.setPassword("password");

System.out.println(userService.findById(user.getId()).getPassword());

userService.update(user);

System.out.println(userService.findById(user.getId()).getPassword());

在控制台中打印出来

qwerty
password
password

这意味着即使在我使用 update() 之前,实体就已经更新了。

我怎样才能阻止它?因此,该实体只能通过调用该方法进行更新,而不能在更改其字段时进行更新。

hibernate 配置:

jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver
jdbc.url=jdbc:hsqldb:mem:myDb
jdbc.username=sa
jdbc.password=sa
hibernate.dialect=org.hibernate.dialect.HSQLDialect
hibernate.hbm2ddl.auto=create

最佳答案

我假设您有一个围绕以下代码打开的交易:

System.out.println(userService.findById(user.getId()).getPassword());
user.setPassword("password");
System.out.println(userService.findById(user.getId()).getPassword());
userService.update(user);
System.out.println(userService.findById(user.getId()).getPassword());

发生的情况是 Hibernate 获取实体,并且由于它仍在事务中,因此该实体是 hibernate 托管实体,因此对实体的任何更改(例如 user.setPassword(...) 将导致这些更改被刷新到数据库.

如果您只将 userService 设为事务性的(即从示例代码周围删除事务并将 userService 注释为 @Transactional (假设您使用的是 Spring)),那么当您执行 user.setPassword(. ..) 它将位于事务之外,并且更改不会持久。

或者,您可以通过调用 EntityManager::detach 方法强制实体分离(以便不再对其进行管理)。

有关其他上下文,请阅读以下链接中的第 3.5 节:https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/objectstate.html

关于java - 如何使HSQL在更改实体字段时不自动更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53111279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com