默认值在休眠中不起作用



我使用columnDefinition来指定列的默认值,但是它不存储默认值,它仅存储null,

请帮忙,下面是我的代码

private String sourceFrom;
@Column(name = "SourceFrom", columnDefinition = "varchar(15) default 'Case'")
public String getSourceFrom() {
    return sourceFrom;
}
public void setSourceFrom(String sourceFrom) {
    this.sourceFrom = sourceFrom;
}
@Column.columnDefinition

DDL阶段用于创建表,而不是在正常程序运行期间使用;可能您必须使用@DynamicInsert/@DynamicUpdate:此注释仅插入(或更新)您在POJO中设置的属性,并让RDBMS管理其他字段。
一个小例子

@Entity
class MyTable {
  @Id
  private int code;
  @Column(name = "SourceFrom", columnDefinition = "varchar(15) default 'Case'")
  private String sourceFrom; 
}

这是从DDL阶段生成的代码

create table mytable (code integer not null,SourceFrom varchar(15) default 'Case')

MyTable t = new MyTable();
t.setCode(10);
session.save(t);

会做这个声明

insert into mytable (code, SourceFrom) values (10,NULL)

MyTable t = new MyTable();
t.setCode(10);
t.setSourceFrom("MANUAL INSERT");
session.save(t);

会做这个声明

insert into mytable (code, SourceFrom) values (10,'MANUAL INSERT')

如果您用@DynamicInsert注释MyTable,则第一个示例将生成此语句

insert into mytable (code) values (10)

如您所见,未指定字段SourceFrom的值,并且插入到数据库表中的值由列定义默认值定义(在本例中为'Case')。

手动处理默认值(在 setter 中、使用 @PrePersist 或其他解决方案)仍然有效。

您提出的解决方案应该有效,但依赖于数据库,因此您可能需要检查语法是否实际适用于具体数据库。另一种更通用的方法是

@PrePersist
void preInsert() {
   if ( getSourceFrom() == null ) { setSourceFrom( "Case" ); }
}

干杯

你的默认值是在数据库中定义的,所以Hibernate不使用它。默认值由数据库设置,但您创建的实体已在休眠缓存中(可以是会话缓存或二级缓存)。

如果加载实体,它来自休眠缓存而不是数据库。

要解决此问题,请调用,请执行以下操作之一:

  • 刷新实体session.refresh(yourEntity)
  • 使用 Java 而不是通过默认值初始化它
  • 使用侦听器@PrePersist

在 DB 端设置默认值。如果要在实体映射中使用它,只需设置默认值,如下所示

私有字符串源来自 ="大小写";

最新更新