使用实体中的默认值与PostgreSQL一起休眠



我正在使用Springboot和PostgreSQL 12开发一个API。我用hibernate创建了一个用户表,有问题的实体字段如下:

@Column(columnDefinition = "BOOLEAN NOT NULL DEFAULT FALSE")
private Boolean emailVerificationStatus = false;

我的表格似乎是正确生成的:

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)
)

我的问题是在运行应用程序时,我收到一条错误消息:

org.hibernate.PropertyValueException: not-null property references a null or transient value : fr.mycompany.app.io.entity.UserEntity.emailVerificationStatus

默认情况下,当我创建用户时,它会发送一个null值。我可以通过在服务层中将值设置为false来解决这个问题,但这不是很优雅。此外,当我删除选项nullable=false时,它运行良好,但值被设置为null,而不是获得默认值。当我尝试将用户发送到API时,postgresql似乎不将默认值(false(作为值。我想在默认情况下强制将null值更改为false。

根据hibernate文档,您可以尝试使用以下方法:

@Entity
@DynamicInsert
public class YourEntity {
@ColumnDefault("false")
private Boolean emailVerificationStatus;
// ...
}

请注意,上面的实体是用@DynamicInsert注释注释的,因此INSERT语句不包括任何不包含值的实体属性。所以,这是为了避免@MikeOrganek的回答中描述的情况。

您需要在服务层中解决此问题。

PostgreSQL遵循SQL标准。仅当列列表中省略了该列或在值列表中指定了default时,default clause值才有效。当Hibernate运行insert时,emailVerificationStatus会显式包含为null

请参阅:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

"<insert语句>quot"一般规则;4b定义了插入行为。

最新更新