Tengo una clase de Entidad de usuario para la que estoy intentando hacer el hash de contraseñas. Pensé que la manera más fácil de hacer esto sería crear un campo de contraseña anotado con @Transient y un campo de contraseña hash que se establece justo antes de que el objeto se persista con un método anotado con @PrePersist y @PreUpdate.JPA @Se han borrado los campos de acceso antes de que se llame al método @PreUpdate
Así que tener algo como esto:
@Transient
private String password;
private String hashedPassword;
@PrePersist
@PreUpdate
private void hashPassword() {
if(password != null) {
hashedPassword = PasswordHasher.hashPassword(password);
}
}
Esto funciona perfectamente bien cuando una entidad se conserva. El campo de contraseña todavía se establece cuando hashPassword se llama, y se calcula y almacena un valor para hashedPassword.
Sin embargo, no ocurre lo mismo con una actualización: incluso si se establece un nuevo valor para la contraseña justo antes de fusionar la entidad, el campo es nulo cuando se llama hashPassword. ¿Por qué es esto? ¿No deberían los valores de los campos transitorios quedarse por lo menos hasta que la entidad persista?
(estoy usando EclipseLink 2.0.0 por cierto, si hace alguna diferencia)
posible dupe: http://stackoverflow.com/questions/2581665/jpa-transient-information-lost-on-create –
Sí, ese es exactamente el mismo comportamiento (ver sección ** 3.2.4.1 Fusión del estado de la entidad independiente * * de la especificación para la semántica de fusión). –