Java 如何使HSQL在更改实体时不自动更新实体';s场
我有一个实体,每当我编辑它的字段时,HSQL都会立即更新该实体 下面的代码Java 如何使HSQL在更改实体时不自动更新实体';s场,java,hibernate,hsqldb,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.p
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(…)将导致将这些更改刷新到DB中
如果您只是将userService设置为事务性的(即,从示例代码中删除事务,并将userService注释为@transactional(假设您使用的是Spring)),那么当您执行user.setPassword(…)
时,它将位于事务之外,并且更改不会持续
或者,您可以通过调用EntityManager::detach方法强制分离实体(以便不再对其进行管理)
有关其他上下文,请阅读以下链接中的第3.5节:是的,你是对的。我的UserService用
@Transactional
注释,我使用的代码所在的类也用@Transactional
注释。在第二个类中删除注释对我有帮助。谢谢!