1

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

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

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

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

谢谢

4

2 回答 2

1

不能简单地注释 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 ,它就可以开箱即用。

于 2020-01-08T14:35:01.453 回答
1

请试试这个:

 @PrePersist
 public void setDefaultTime(BaseEntity entity) {
   if(entity.getInsertTime() == null) {
       entity.setInsertTime(new Timestamp((new Date()).getTime())):
   }
}
于 2020-01-08T15:06:08.153 回答