[英]Default value not working in 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;
}
在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')
如果使用@DynamicInsert
注釋MyTable
,則第一個示例將生成此語句
insert into mytable (code) values (10)
如您所見,未指定字段SourceFrom
的值,並且插入到數據庫表中的值由列定義默認值(在本例中為'Case'
)定義。
手動處理默認值(在setter中,使用@PrePersist
或其他解決方案)仍然有效。
您提出的解決方案應該可以工作,但與數據庫有關,因此您可能需要檢查語法是否真正適用於您的具體數據庫。 另一種更通用的方法是
@PrePersist
void preInsert() {
if ( getSourceFrom() == null ) { setSourceFrom( "Case" ); }
}
干杯,
您的默認值是在數據庫中定義的,因此Hibernate不會使用它。 默認值由數據庫設置,但您創建的實體已經處於休眠緩存中(它可以是會話緩存或L2緩存)。
如果你加載實體它來自Hibernate緩存而不是數據庫。
要解決此問題,請執行以下操作之一:
session.refresh(yourEntity)
@PrePersist
監聽器 在DB端創建默認值。 如果要在實體映射中使用它,只需設置默認值,如下所示
private String sourceFrom =“Case”;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.