默认值在休眠状态下不起作用

问题描述 投票:0回答:5

我使用

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;
}
java hibernate
5个回答
9
投票

@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);

将会做这个声明

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

如果您用

MyTable
注释
@DynamicInsert
,第一个示例将生成此语句

insert into mytable (code) values (10)

正如您所看到的,字段

SourceFrom
的值未指定,插入到数据库表中的值由列定义默认值定义(在本例中为
'Case'
)。

手动处理默认值(在setter中,使用

@PrePersist
或其他解决方案)仍然有效。


2
投票

您提出的解决方案应该可行,但依赖于数据库,因此您可能需要检查您的语法是否确实适用于您的具体数据库。另一种更通用的方法是

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

干杯,


0
投票

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

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

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

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

0
投票
  • 我遇到了同样的情况,问题是如果该值显式设置为null,那么数据库将不会使用默认值。

  • 这是一个名为 @DynamicInsert

    的中间事物
  • 它所做的就是简单地消除空字段。这样数据库就会插入默认值。

  • 参考:- Hibernate 文档

@动态插入


-1
投票

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

私有字符串sourceFrom =“案例”;

© www.soinside.com 2019 - 2024. All rights reserved.