У меня есть класс User Entity, для которого я пытаюсь выполнить хэширование пароля. Я думал, что самый простой способ сделать это - создать поле пароля, аннотированное с помощью поля @Transient и хэшированного пароля, которое устанавливается непосредственно перед тем, как объект сохраняется с помощью метода, аннотированного с помощью @PrePersist и @PreUpdate.JPA @Transient поля, очищаемые до метода @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 Кстати, если это делает никакой разницы)
Возможный обман: http://stackoverflow.com/questions/2581665/jpa-transient-information-lost-on-create –
Да, это то же самое поведение (см. Раздел ** 3.2.4.1 Слияние отдельного состояния сущности * * спецификации для семантики слияния). –