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