作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Play! 1.2.4 和 PostgreSQL 9.1。我创建了一个包含 created_at
列的表,类型为:timestamp without time zone
。它的默认值为 now()
。
当我使用我的实体类为此表获取数据时,问题就来了。 createdAt
字段总是返回 null
。这是字段定义:
@Column(name="created_at", insertable=false)
public java.sql.Date createdAt;
所有其他字段均已正确填充。我尝试将字段类型更改为 Date
、Calendar
、Timestamp
等,并尝试添加 @Timestamp
注释。但没有一种组合被证明是成功的。
在此先感谢您的帮助!
作为引用,这是我用来创建表的 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 插入记录有关。数据库为 created_at
填充默认值 now()
,但不知何故 Hibernate 在获取该行时不知道它。
如果我查询已经存在的行,createdAt
字段会被正确填充!好的...这缩小了问题的范围。
最佳答案
我没有完全解决问题,但我解决了它。
我没有让数据库提供默认值 now()
,而是用 @PrePersist
在 JPA 中表示:
@Column(name="created_at", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
public Date createdAt;
@PrePersist
protected void onCreate() {
createdAt = new Date();
}
很好用!灵感来自 this answer .我仍然不确定为什么 Hibernate 没有使用数据库中应用的默认值进行更新。它一直认为该值仍然为空。
关于postgresql - 如何将时间戳列映射到 JPA 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528439/
我是一名优秀的程序员,十分优秀!