使用默认值在实体中与PostgreSQL一起使用Hibernate

3

我正在使用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而不是获取默认值。似乎postgresql在尝试向API发送用户时不将默认值(false)视为值。我想强制将null值默认更改为false。

2个回答

7
根据Hibernate 文档,您可以尝试使用以下方法:
@Entity
@DynamicInsert
public class YourEntity {

  @ColumnDefault("false")
  private Boolean emailVerificationStatus;

  // ...
}

请注意,上述实体被标注为@DynamicInsert注解,以便INSERT语句不包括任何不包含值的实体属性。因此,这可以避免@MikeOrganek答案中描述的情况。

2
你需要在服务层解决这个问题。
PostgreSQL 遵循 SQL 标准。仅当列在列列表中被省略或在值列表中指定了默认值时,default clause 的值才有效。当 Hibernate 运行 insert 时,emailVerificationStatus 明确包含为 null
请参见: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt 第 389 页的“<insert statement>”、“General Rules”、“4b”一节定义了插入行为。

1
没错!即使设置了一个值,该值默认也会被设置为 null...SternK 的解决方案对我来说很好,符合我的需求。否则我就得在服务层解决这个问题(这也是我一开始正在做的)。 - davidvera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接