默认值不在休眠状态下工作

com*_*mit 3 java hibernate

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

Luc*_*cci 6

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

这是DDL阶段生成的代码

create table mytable (code integer not null,SourceFrom varchar(15) default 'Case')
Run Code Online (Sandbox Code Playgroud)
MyTable t = new MyTable();
t.setCode(10);
session.save(t);
Run Code Online (Sandbox Code Playgroud)

会做这个陈述

insert into mytable (code, SourceFrom) values (10,NULL)
Run Code Online (Sandbox Code Playgroud)
MyTable t = new MyTable();
t.setCode(10);
t.setSourceFrom("MANUAL INSERT");
session.save(t);
Run Code Online (Sandbox Code Playgroud)

会做这个陈述

insert into mytable (code, SourceFrom) values (10,'MANUAL INSERT')
Run Code Online (Sandbox Code Playgroud)

如果MyTable使用@DynamicInsert第一个示例进行注释将生成此语句

insert into mytable (code) values (10)
Run Code Online (Sandbox Code Playgroud)

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

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