Reputation: 1489
I'm developping an API using Springboot and PostgreSQL 12. I created a user table with hibernate and the entity field that is problematic is the following:
@Column(columnDefinition = "BOOLEAN NOT NULL DEFAULT FALSE")
private Boolean emailVerificationStatus = false;
My table seems to be correctly generated :
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)
)
My issue is while running the application I receive an error message :
org.hibernate.PropertyValueException: not-null property references a null or transient value : fr.mycompany.app.io.entity.UserEntity.emailVerificationStatus
By default, when I create the user, it sends a null value. I can solve this issue by setting the value to false in my service layer but it's not very elegant. Also, When I remove the option nullable = false, it works fine but the value is set to null instead of getting the default value. It seems that postgresql doesn't take the default value (false) as value when I try to send a user to my API. I want to force changing null value to false by default.
Upvotes: 3
Views: 3360
Reputation: 13041
According to the hibernate documentation you can try to use the following approach:
@Entity
@DynamicInsert
public class YourEntity {
@ColumnDefault("false")
private Boolean emailVerificationStatus;
// ...
}
Please note that the entity above is annotated with the @DynamicInsert
annotation so that the INSERT
statement does not include any entity attribute that does not contain a value. So, this is allow you to avoid case described in the @MikeOrganek's answer.
Upvotes: 7
Reputation: 12494
You need to solve this in your service layer.
PostgreSQL is following the SQL standard. The default clause
value is in effect only if the column is omitted from the column list or if default
is specified in the value list. When Hibernate runs the insert
, the emailVerificationStatus
is explicitly included as null
.
Please see: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
The section "<insert statement>," "General Rules," 4b, on page 389 defines insert behavior.
Upvotes: 2