【问题标题】:Default value not working in hibernate默认值在休眠状态下不起作用
【发布时间】:2014-02-24 09:08:57
【问题描述】:

我已经使用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;
}

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    @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或其他解决方案)仍然有效。

    【讨论】:

      【解决方案2】:

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

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

      干杯,

      【讨论】:

      • 我试过这个,但在保存案例对象之前它没有调用preInsert
      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        private String sourceFrom ="Case";

        【讨论】:

          猜你喜欢
          • 2018-11-12
          • 1970-01-01
          • 2011-04-03
          • 1970-01-01
          • 2013-07-26
          • 2016-01-04
          • 2019-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多