簡體   English   中英

默認值不在休眠狀態下工作

[英]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)
  • 使用java而不是默認值初始化它
  • 使用@PrePersist監聽器

在DB端創建默認值。 如果要在實體映射中使用它,只需設置默認值,如下所示

private String sourceFrom =“Case”;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM