gpt4 book ai didi

java - 如果表属性有默认值clock_timestamp(),如何注释实体中的属性?

转载 作者:行者123 更新时间:2023-11-30 01:41:53 30 4
gpt4 key购买 nike

在Postgres数据库上,我有一个带有“insert_time”属性(timestamptz)的表,它具有clock_timestamp()函数的默认值。

在Java中,我已经从表中创建了实体,但是当我想将新记录插入表中时,insert_time的值为null而不是clock_timestamp()。

如何正确注释实体,以便在 Java 中未传递 insert_time 时,在表本身上使用 Clock_timestamp() 的“默认值”?

或者如果属性设置为空,如何读取实体中的clock_timestamp()。

谢谢

最佳答案

您不能简单地注释 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 {...}

现在,如果您真的有兴趣让数据库控制插入时间,而不是委托(delegate)您的应用程序来执行此操作,您可以修改上面的代码并在其中连接一个entityManager,以便您可以执行该选择针对数据库并直接设置该值。

更新:如何委托(delegate)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,它就应该可以开箱即用。

关于java - 如果表属性有默认值clock_timestamp(),如何注释实体中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59647612/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com