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

时间:2014-02-24 09:08:57

标签: 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;
}

4 个答案:

答案 0 :(得分:6)

在DDL阶段使用

@Column.columnDefinition创建表,而不是在正常程序运行期间;可能你必须使用@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或其他解决方案)仍然有效。

答案 1 :(得分:2)

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

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

干杯,

答案 2 :(得分:0)

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

如果你加载实体它来自Hibernate缓存而不是数据库。

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

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

答案 3 :(得分:0)

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

private String sourceFrom =“Case”;