У меня есть класс User Entity, который я пытаюсь использовать для хэширования паролей. Я думал, что самый простой способ сделать это - создать поле пароля, аннотированное с помощью поля @Transient и хэшированного пароля, которое устанавливается непосредственно перед тем, как объект сохраняется с помощью метода, аннотированного с помощью @PrePersist и @PreUpdate.
Итак, у меня есть что-то вроде этого:
@Transient
private String password;
private String hashedPassword;
@PrePersist
@PreUpdate
private void hashPassword() {
if(password != null) {
hashedPassword = PasswordHasher.hashPassword(password);
}
}
Это прекрасно работает, когда объект сохраняется. Поле пароля по-прежнему устанавливается по времени, когда вызывается hashPassword, и вычисляется и сохраняется значение для hashedPassword.
Тем не менее, это не относится к обновлению - даже если новое значение для пароля установлено перед объединением объекта, это поле равно null на момент, когда вызывается hashPassword. Почему это? Должны ли значения переходных полей придерживаться, по крайней мере, до тех пор, пока сущность не будет сохранена?
(Я использую EclipseLink 2.0.0 кстати, если это имеет значение)