我在数据库中有一个默认值为
有什么建议吗?
sysdate
的列。我想找到一种方法,在应用程序端不提供任何对应属性的情况下插入该默认值。顺便说一下,我正在使用基于注解的配置。有什么建议吗?
default SYSDATE
dbms-side,它仍会获得null
值的原因是,如果查询中给该列赋了值,则该列的默认值default
将不起作用。这意味着即使给出null
,它也不应出现在INSERT INTO
语句中。default SYSDATE
,则应配置@Column
为insertable=false
,以便从SQL INSERT
中排除该列。@Temporal(TemporalType.TIMESTAMP)
@Column(name = "myDate", insertable=false)
private Date myDate;
default SYSDATE
定义有一个替代方案。您可以使用@PrePersist
和@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";
@Generated
如何帮助到你。你尝试在@Column
定义中使用insertable=false
吗?正如上面的评论所提到的那样,只要继续使用Hibernate,@UpdateTimestamp
也是一个非常有效的方法。 - Xavi Lópezinsertable=false
,但它没有起作用。在.save()
后,modified_at 列仍然返回为 null,不知道为什么... - DougUPDATE
而不是一个INSERT
,那么updatable=false
可能会有所帮助。无论如何,@UpdateTimestamp
已经是一个很好的解决方案了,如果可能的话,我更喜欢在自己的代码中设置默认值,而不是在DBMS端设置。 - Xavi Lópezcreation_date
,但不能默认creation_user
),我宁愿将它们放在一个地方(当然尽可能的情况下),特别是我知道我有控制权的地方,并且不会引起任何副作用,而不是分散在不同的层中。 - Xavi López