2014-02-24 209 views
3

我必须使用columnDefinition为一列指定默认值不工作,但它不存储默认值是只存储空,默认值处于休眠

请帮忙关于这一点,下面是我的代码

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

public void setSourceFrom(String sourceFrom) { 
    this.sourceFrom = sourceFrom; 
} 

回答

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; 
} 

,这是从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); 

如果注释MyTable@DynamicInsert第一个例子会产生这种说法

insert into mytable (code) values (10) 

正如你所看到现场SourceFrom的价值会做这种说法

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

没有被指定,并且定义了插入到数据库表中的值按列定义默认值(在这种情况下为'Case')。

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

2

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

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

干杯,

+0

我已经试过这个,但它不保存case对象之前调用'preInsert' – commit

0

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

如果加载实体,它来自Hibernate缓存而非数据库。

为了解决这个问题调用执行下列操作之一:

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

使默认DB侧的值。如果你想在实体映射中使用它,只需设置默认值如下

private String sourceFrom =“Case”;