Как сделать так, чтобы HSQL не обновлял сущность автоматически при изменении поля сущности - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть объект, и всякий раз, когда я редактирую его поле, 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(), сущность уже обновлена.

Как я могу это остановить? Таким образом, эта сущность может быть обновлена ​​только при вызове метода, но не при изменении его поля.

Конфигурация Hibernate:

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 голосов
/ 02 ноября 2018

Я предполагаю, что у вас есть транзакция, открытая по следующему коду:

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.

Дополнительный контекст читайте в разделе 3.5 по следующей ссылке: https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/objectstate.html

...