Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使HSQL在更改实体时不自动更新实体';s场_Java_Hibernate_Hsqldb - Fatal编程技术网

Java 如何使HSQL在更改实体时不自动更新实体';s场

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

我有一个实体,每当我编辑它的字段时,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(…)将导致将这些更改刷新到DB中

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

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


有关其他上下文,请阅读以下链接中的第3.5节:

是的,你是对的。我的UserService用
@Transactional
注释,我使用的代码所在的类也用
@Transactional
注释。在第二个类中删除注释对我有帮助。谢谢!