我使用
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')
如果您用
MyTable
注释 @DynamicInsert
,第一个示例将生成此语句
insert into mytable (code) values (10)
正如您所看到的,字段
SourceFrom
的值未指定,插入到数据库表中的值由列定义默认值定义(在本例中为 'Case'
)。
手动处理默认值(在setter中,使用
@PrePersist
或其他解决方案)仍然有效。
您提出的解决方案应该可行,但依赖于数据库,因此您可能需要检查您的语法是否确实适用于您的具体数据库。另一种更通用的方法是
@PrePersist
void preInsert() {
if ( getSourceFrom() == null ) { setSourceFrom( "Case" ); }
}
干杯,
您的默认值是在数据库中定义的,因此 Hibernate 不使用它。 默认值是由数据库设置的,但是您创建的实体已经在hibernate缓存中(可以是会话缓存或L2缓存)。
如果加载实体,它来自 Hibernate 缓存而不是数据库。
要解决此问题,请执行以下操作之一:
session.refresh(yourEntity)
@PrePersist
监听器我遇到了同样的情况,问题是如果该值显式设置为null,那么数据库将不会使用默认值。
这是一个名为 @DynamicInsert
的中间事物它所做的就是简单地消除空字段。这样数据库就会插入默认值。
参考:- Hibernate 文档
@动态插入
在DB端设置默认值。如果你想在实体映射中使用它,只需设置默认值如下
私有字符串sourceFrom =“案例”;