我的应用程序使用视图对象 - 实体对进行前端 - 后端交互。前端仅使用VO,而后端仅与实体进行数据库对话。并且存在VO< - >。实体转换
我的实体类有2个时间戳属性,createTimestamp和lastUpdateTimestamp,对应于其数据表中的两个不可为空的列。但是VO从来没有这两个属性。
我当前的问题:由于VO不包含Timestamp属性,从VO转换的实体将具有2个Timestamp属性为null,当我执行该实体更新时,数据库发生错误,因为它认为我我试图将Timestamp列设置为null,这是不允许的。
我想知道我们如何处理这个问题。有没有办法让数据库在更新时加入这2个时间戳,或者在更新实体之前是否有一种“优雅”的方式来获取时间戳值?我经常需要一次更新实体列表。
我发现的解决方案 我在@Column注释下添加了一个属性“updatable”,它似乎解决了我的问题。 即@Column(name =“CREATE_STAMP”,nullable = false,updatable = false)
从这篇文章暗示 Creation timestamp and last update timestamp with Hibernate and MySQL
答案 0 :(得分:0)
为timestamp列的DB列设置默认值,这意味着如果在INSERT查询中提供(通过VO)它将采用它,否则它将是默认值。
更新:您可以使用Hibernate拦截器,它们的用途是什么。例如,需要此类字段的实体可以实现以下接口:
public interface Auditable {
Date getCreated();
void setCreated(Date created);
Date getModified();
void setModified(Date modified);
}
然后拦截器总是在保存时设置修改后的字段,并且只在尚未设置的情况下设置创建的字段。