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

时间:2018-11-02 00:44:06

标签: java hibernate hsqldb

我有一个实体,每当编辑其字段时,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

1 个答案:

答案 0 :(得分:1)

我假设您围绕以下代码进行交易:

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会获取实体,并且由于它仍在事务中,因此该实体是一个休眠管理的实体,因此对该实体的任何更改(例如user.setPassword(...)都会导致这些更改被刷新到数据库中

如果相反,您仅使userService成为事务性的(即从示例代码周围删除该事务,并使用@Transactional注释userService(假设您使用的是Spring)),则在执行user.setPassword(...)时,在交易之外,更改将不会持续。

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

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