Postgresql 如何将时间戳列映射到JPA类型?
我在玩!1.2.4和PostgreSQL 9.1。我创建了一个表,在列中创建了一个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; 所有其他字段都已正确填充。我已尝试将字段类型更改为日期、日历、时间戳等,并
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
阅读此内容。希望这有帮助