有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java默认值在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;
}

共 (4) 个答案

  1. # 1 楼答案

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

    私有字符串sourceFrom=“Case”

  2. # 2 楼答案

    您提出的解决方案应该可以工作,但依赖于数据库,所以您可能需要检查语法是否真的适用于具体的数据库。另一种更通用的方法是

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

    干杯

  3. # 3 楼答案

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

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

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

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

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

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

    insert into mytable (code) values (10)
    

    正如您所见,字段SourceFrom的值没有指定,插入数据库表的值是由列定义默认值定义的(在本例中为'Case'

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