Postgresql 如何将时间戳列映射到JPA类型?

Postgresql 如何将时间戳列映射到JPA类型?,postgresql,jpa,playframework,Postgresql,Jpa,Playframework,我在玩!1.2.4和PostgreSQL 9.1。我创建了一个表,在列中创建了一个created\u,类型为:timestamp,不带时区。它的默认值为now() 当我使用这个表的实体类获取数据时,问题就出现了。createdAt字段总是返回null。以下是字段定义: @Column(name="created_at", insertable=false) public java.sql.Date createdAt; 所有其他字段都已正确填充。我已尝试将字段类型更改为日期、日历、时间戳等,并

我在玩!1.2.4和PostgreSQL 9.1。我创建了一个表,在列中创建了一个
created\u,类型为:
timestamp,不带时区
。它的默认值为
now()

当我使用这个表的实体类获取数据时,问题就出现了。
createdAt
字段总是返回
null
。以下是字段定义:

@Column(name="created_at", insertable=false)
public java.sql.Date createdAt;
所有其他字段都已正确填充。我已尝试将字段类型更改为日期、日历、时间戳等,并尝试添加时间戳注释。但没有任何组合被证明是成功的

提前感谢您的帮助

作为参考,这里是我用来创建表的DDL

CREATE TABLE Users
(
  id serial     NOT NULL,
  username text NOT NULL,
  email text    NOT NULL,
  password_hash text NOT NULL DEFAULT 0,
  created_at timestamp without time zone DEFAULT now(),
  CONSTRAINT Users_pkey PRIMARY KEY (id),
  CONSTRAINT Users_username_key UNIQUE (username)
);
更新: 我认为问题与使用JPA插入记录有关。数据库为在
处创建的
填充一个默认值
now()
,但Hibernate在获取该行时不知何故不知道该值

如果我查询已经存在的行,则
createdAt
字段填充正确! 好啊这可以缩小问题的范围。

尝试以下方法:

@Column(name="create_at", insertable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date createAt;

我没有准确地解决这个问题,但我解决了它

我没有让数据库提供默认值
now()
,而是用JPA用
@PrePersist
表示它:

@Column(name="created_at", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
public Date createdAt;

@PrePersist
protected void onCreate() {
    createdAt = new Date();
}
那很好!灵感来源于。
我仍然不确定为什么Hibernate没有使用数据库中应用的默认值进行更新。它一直认为该值仍然为空。

您需要从数据库中分离并获取实体。Insert语句不包含created_at字段,因此在创建时它不由JPA管理。在存储库中,它将如下所示:

@Transactional
public Log save(Log log) {
    this.em.persist(log);
    this.em.detach(log);
    return this.em.find(Log.class, log.getId());
}

以防万一,如果填充字段定义的类是一个主类,其他所有类都对其进行了扩展,请不要忘记使用注释对其进行定义:

import javax.persistence.MappedSuperclass;
@映射超类
公共类MySuperClass{}

我试过了,但没有成功。该字段仍从数据库返回空值。请尝试此操作,然后
@Column(name=“create_at”,insertable=false,nullable=false)
查询结果如何?或者也可以尝试以下操作:
@Column(name=“create_at”,insertable=false,columnDefinition=“now()”
该表已在数据库中定义。我没有使用JPADL在运行时创建它。我可以使用JPA插入一行,在
处创建的
在数据库中自动设置为now()。但是当我获取行时,除了createdAt字段为null之外,所有字段都存在。不知何故,
timestamap
数据库值未被转换。请使用
java.util.Date
java.util.Calendar
阅读此内容。希望这有帮助