Hibernate 与 PostgreSQL 使用实体中的默认值

dav*_*era 3 postgresql hibernate

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

@Column(columnDefinition = "BOOLEAN NOT NULL DEFAULT FALSE")
private Boolean emailVerificationStatus = false;
Run Code Online (Sandbox Code Playgroud)

我的表似乎已正确生成:

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)
)
Run Code Online (Sandbox Code Playgroud)

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

org.hibernate.PropertyValueException: not-null property references a null or transient value : fr.mycompany.app.io.entity.UserEntity.emailVerificationStatus
Run Code Online (Sandbox Code Playgroud)

默认情况下,当我创建用户时,它会发送一个空值。我可以通过在服务层中将值设置为 false 来解决这个问题,但这不是很优雅。另外,当我删除选项 nullable = false 时,它​​工作正常,但该值设置为 null 而不是获取默认值。当我尝试将用户发送到我的 API 时,postgresql 似乎不采用默认值(false)作为值。我想默认将 null 值强制更改为 false。

Ste*_*rnK 7

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

@Entity
@DynamicInsert
public class YourEntity {

  @ColumnDefault("false")
  private Boolean emailVerificationStatus;

  // ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,上面的实体使用了注解进行了注释@DynamicInsert,这样INSERT语句中就不会包含任何不包含值的实体属性。因此,这可以让您避免 @MikeOrganek 的答案中描述的情况。