3

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.

2 Answers 2

7

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.

Sign up to request clarification or add additional context in comments.

Comments

2

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.

1 Comment

Right! the value was set to null by default even with setting a value....SternK solution is fine to me and fit my needs. Otherwise I would have to solve this in Service layer (what i was doing).

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.