Estoy desarrollando una API usando Springboot y PostgreSQL 12. Creé una tabla de usuario con hibernate y el campo de entidad que es problemático es el siguiente:
@Column(columnDefinition = "BOOLEAN NOT NULL DEFAULT FALSE") private Boolean emailVerificationStatus = false;
Mi tabla parece estar correctamente generada:
create table users ( id int8 generated by default as identity, email varchar(120) not null, email_verification_status boolean default false not null, email_verification_token varchar(255), encrypted_password varchar(255) not null, first_name varchar(50) not null, last_name varchar(50) not null, user_id varchar(255) not null, primary key (id) )
Mi problema es que al ejecutar la aplicación recibo un mensaje de error:
org.hibernate.PropertyValueException: not-null property references a null or transient value : fr.mycompany.app.io.entity.UserEntity.emailVerificationStatus
Por defecto, cuando creo el usuario, envía un valor nulo. Puedo resolver este problema configurando el valor en falso en mi capa de servicio, pero no es muy elegante. Además, cuando elimino la opción anulable = falso, funciona bien, pero el valor se establece en nulo en lugar de obtener el valor predeterminado. Parece que postgresql no toma el valor predeterminado (falso) como valor cuando intento enviar un usuario a mi API. Quiero forzar el cambio de valor nulo a falso de forma predeterminada.
De acuerdo con la documentación de hibernación, puede intentar utilizar el siguiente enfoque:
@Entity @DynamicInsert public class YourEntity { @ColumnDefault("false") private Boolean emailVerificationStatus; // ... }
Tenga en cuenta que la entidad anterior está anotada con la anotación @DynamicInsert
para que la INSERT
no incluya ningún atributo de entidad que no contenga un valor. Entonces, esto le permite evitar el caso descrito en la respuesta de @MikeOrganek.
Debe resolver esto en su capa de servicio.
PostgreSQL sigue el estándar SQL. El valor de default clause
solo tiene efecto si la columna se omite de la lista de columnas o si se especifica el valor default
en la lista de valores. Cuando Hibernate ejecuta la insert
, emailVerificationStatus
se incluye explícitamente como null
.
Consulte: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
La sección "<sentencia de inserción>", "Reglas generales", 4b, en la página 389 define el comportamiento de inserción.