不能简单地注释 JPA 实体并获取函数返回的值clock_timestamp()
为了使您的代码获得该值,您需要进行查询
SELECT clock_timestamp();
但是您可以使用 JPA-Listeners 来实现类似的功能:
public class TimestampEntityListener {
@PrePersist
public void setDefaultTime(BaseEntity entity) {
if(entity.getInsertTime() == null) {
entity.setInsertTime(new Timestamp((new Date()).getTime())):
}
}
}
@MappedSuperclass
@EntityListeners({TimestampEntityListener.class})
public abstract class BaseEntity {...}
现在,如果您真的对让 DB 控制插入时间感兴趣,而不是委托您的应用程序来执行此操作,您可以修改上面的代码并在其中连接 entityManager,以便您可以对 DB 执行该选择并直接设置该值。
更新:关于如何委托 entityListener 查询数据库
public class TimestampEntityListener {
@Autowired
EntityManager entityManager;
@PrePersist
public void setDefaultTime(BaseEntity entity) {
AutowireHelper.autowire(this, this.entityManager);
if(entity.getInsertTime() == null) {
Timestamp timestamp = (Timestamp)entityManager.createNativeQuery("select clock_timestamp()").getSingleResult();
entity.setInsertTime(timestamp):
}
}
}
您可以将此类用于AutowireHelper并使用上面的代码,只要您的实体将扩展BaseEntity ,它就可以开箱即用。