sla*_*ery 9 postgresql jpa playframework
我正在玩Play!1.2.4和PostgreSQL 9.1.我创建了一个带有created_at列的表,类型为:timestamp without time zone.它的默认值为now().
当我使用我的Entity类为此表获取数据时出现问题.这个createdAt领域总是回来null.这是字段定义:
@Column(name="created_at", insertable=false)
public java.sql.Date createdAt;
Run Code Online (Sandbox Code Playgroud)
所有其他字段都正确填充.我试图改变字段类型为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)
);
Run Code Online (Sandbox Code Playgroud)
更新:
我认为问题与使用JPA插入记录有关.数据库填充默认值now()for created_at,但是在获取该行时Hibernate不知道它是什么.
如果我查询已经存在的行,createdAt则会正确填充该字段!好的......这缩小了问题的范围.
sla*_*ery 15
我没有完全解决问题,但我解决了这个问题.
我没有让数据库提供默认值now(),而是在JPA中用@PrePersist以下方式表达:
@Column(name="created_at", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
public Date createdAt;
@PrePersist
protected void onCreate() {
createdAt = new Date();
}
Run Code Online (Sandbox Code Playgroud)
这很好用!从这个答案中得到的灵感.我仍然不确定为什么Hibernate没有使用数据库中应用的默认值进行更新.它被认为价值仍然是空的.
| 归档时间: |
|
| 查看次数: |
29660 次 |
| 最近记录: |