Я предполагаю, что у вас есть транзакция, открытая по следующему коду:
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