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

Bru*_*Cui 39 hibernate jpa default sysdate

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

有什么建议?

Xav*_*ica 88

null即使将其定义为default SYSDATEdbms-side,date列在插入时获取值的原因是,default只有在查询中未给出列时才使用列的值.这意味着它必须不会出现在INSERT INTO句子中,即使已经给出了null.

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

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "myDate", insertable=false)
private Date myDate;
Run Code Online (Sandbox Code Playgroud)

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

有一种替代方法可以使用default SYSDATEDBMS 的定义.当且仅当尚未分配时,您可以使用@PrePersist@PreUpdate注释在保存/更新之前将当前日期分配给属性:

@PrePersist
protected void onCreate() {
    if (myDate == null) { myDate = new Date(); }
}
Run Code Online (Sandbox Code Playgroud)

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


raj*_*lli 18

如果您正在使用Hibernate,那么您可以使用@CreationTimestamp插入默认日期.

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;
Run Code Online (Sandbox Code Playgroud)

@UpdateTimestamp在必要时更新值

@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;
Run Code Online (Sandbox Code Playgroud)