【问题标题】:How can I use DB side default value while use Hibernate save?使用 Hibernate 保存时如何使用 DB 端默认值?
【发布时间】:2013-01-20 03:41:03
【问题描述】:

我在 DB 中有一个默认值为 sysdate 的列。我正在寻找一种方法来插入默认值,而我没有为应用程序端的相应属性提供任何内容。 顺便说一句,我正在使用基于注释的配置。

有什么建议吗?

【问题讨论】:

    标签: hibernate jpa default sysdate


    【解决方案1】:

    或者你可以直接初始化POJO的属性例如:

    //java code property declaration
    
    private String surname = "default";
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 Hibernate,那么您可以使用 @CreationTimestamp 插入默认日期。

      @CreationTimestamp
      @Temporal(TemporalType.TIMESTAMP)
      @Column(name = "create_date")
      private Date createDate;
      

      @UpdateTimestamp 在必要时更新值

      @UpdateTimestamp
      @Temporal(TemporalType.TIMESTAMP)
      @Column(name = "modify_date")
      private Date modifyDate;
      

      【讨论】:

      • 这是为我做的 - 一直在寻找这个答案!谢谢你,@rajadilipkolli :)
      • 这对我有用,第一个答案没有用。谢谢@rajadilipkolli
      • 这可行,但使用系统时间,有什么方法可以使用数据库时间?像 HQL 的 CURRENT_TIMESTAMP()?编辑:不更改数据库架构?
      【解决方案3】:

      date 列在插入时得到null 值的原因,即使它被定义为default SYSDATE dbms-side,是因为该列的default 值仅在未给出列时使用查询中的值。这意味着它不能出现在INSERT INTO 句子中,即使它已被赋予null

      如果您想在 DBMS 端使用default SYSDATE,您应该将@Column 配置为insertable=false,以便将列从您的SQL INSERTs 中取出。

      @Temporal(TemporalType.TIMESTAMP)
      @Column(name = "myDate", insertable=false)
      private Date myDate;
      

      请注意,这种方法将始终忽略您在创建实体时为应用中的属性提供的值。如果您确实希望有时能够提供日期,也许您应该考虑使用数据库触发器来设置值而不是默认值。

      除了使用 DBMS 的 default SYSDATE 定义之外,还有另一种方法。您可以使用 @PrePersist@PreUpdate 注释在保存/更新之前将当前日期分配给属性,当且仅当尚未分配时:

      @PrePersist
      protected void onCreate() {
          if (myDate == null) { myDate = new Date(); }
      }
      

      这个密切相关的问题提供了不同的方法:Creation timestamp and last update timestamp with Hibernate and MySQL

      【讨论】:

      • 感谢哈维非常详细的解释。这超出了我的预期,并且确实有效!
      • @user1900240 很高兴有帮助:)
      • insertable=false 对我不起作用。我正在使用 Postgres,我在列上设置了默认值,但它是 null。
      • @Doug 很高兴知道你把它整理出来了,除了avoiding a backtrip to the DB to retrieve the value 之外,一旦它被分配到数据库端,看不到@Generated 在这里会有什么帮助。您在@Column 定义中尝试过insertable=false 吗? @UpdateTimestamp 也是上面 cmets 中提到的一种非常有效的方法,只要您继续使用 Hibernate。
      • @Doug 多种原因 - 考虑到默认值大部分时间服从应用程序逻辑(即您可以默认 creation_date dbms-side 但不能默认 creation_user)我宁愿将它们放在一起在一个地方(当然尽可能),特别是我知道我可以控制的地方,不会造成任何副作用,而不是分散在不同的层。
      猜你喜欢
      • 2014-03-25
      • 2017-05-29
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多