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

How to make HSQL not auto update entity when change entity's field

我有一个实体,每当我编辑它的字段时,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() 之前,实体已经更新。

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

休眠配置:

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 方法强制实体分离(使其不再受管理)。

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