使用Hibernate保存时如何使用数据库端默认值?

时间:2013-02-05 09:08:52

标签: hibernate jpa default sysdate

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

有什么建议吗?

4 个答案:

答案 0 :(得分:79)

日期列在插入时获得null值的原因是,即使它被定义为default SYSDATE dbms-side,也只是使用了列的default值如果列中没有给出查询中的值。这意味着它必须不会出现在INSERT INTO句子中,即使它已被赋予null

如果要在DBMS端使用default SYSDATE,则应将@Column配置为insertable=false,以便从SQL INSERT中获取列。

@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

答案 1 :(得分:14)

如果您正在使用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;

答案 2 :(得分:3)

insertable = false 添加到@Column定义

有关详细信息,请参阅此link

答案 3 :(得分:0)

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

//java code property declaration

private String surname = "default";