2014-02-24 294 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」;