提问者:小点点

如何在使用Hibernate保存时使用DB端默认值?


我在DB中有一个列,默认值为< code>sysdate。我正在寻找一种方法来插入默认值,而我没有给应用程序端的相应属性任何东西。顺便说一下,我正在使用基于注释的配置。

有什么建议吗?


共3个答案

匿名用户

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

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

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

考虑到这种方法在创建实体时总是会忽略你在应用中提供给属性的值。如果你真的希望有时能够提供日期,也许你应该考虑使用数据库触发器来设置值,而不是默认值。

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

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

这个密切相关的问题提供了不同的方法:使用Hibernate和MySQL创建时间戳和最后更新时间戳。

匿名用户

如果您使用的是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;

匿名用户

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

//java code property declaration

private String surname = "default";