设置由数据库生成的 JPA 时间戳列?

2022-08-31 12:13:46

在我的 SQL Server 2000 数据库中,我有一个名为 设置为 的时间戳(在函数中而不是在数据类型中)列,其类型设置为其默认值/绑定。DATETIMElastTouchedgetdate()

我正在使用 Netbeans 6.5 生成的 JPA 实体类,并在我的代码中包含此内容

@Basic(optional = false)
@Column(name = "LastTouched")
@Temporal(TemporalType.TIMESTAMP)
private Date lastTouched;

但是,当我尝试将对象放入数据库中时,我得到,

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.generic.Stuff.lastTouched

我尝试过将 设置为 ,但这会引发一个异常,指出数据库不允许列的值,而这并不是设计使然。@Basic(optional = true)nullTIMESTAMP

ERROR JDBCExceptionReporter - Cannot insert the value NULL into column 'LastTouched', table 'DatabaseName.dbo.Stuff'; column does not allow nulls. INSERT fails.

我以前让它在纯Hibernate中工作,但是我已经切换到JPA,并且不知道如何告诉它这个列应该在数据库端生成。请注意,我仍然使用Hibernate作为我的JPA持久性层。


答案 1

我通过将代码更改为

@Basic(optional = false)
@Column(name = "LastTouched", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastTouched;

因此,在生成 SQL 插入时,将忽略时间戳列。不确定这是否是最好的方法。欢迎提供反馈。


答案 2

我意识到这有点晚了,但我成功地用

@Column(name="timestamp", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

这也应该与 和 一起使用。我正在使用JPA / Hibernate与Oracle,所以YMMV。CURRENT_DATECURRENT_TIME