2011-12-16 4 views
6

私はPlayを使用しています! 1.2.4およびPostgreSQL 9.1 created_at列のテーブルを作成しました。タイプはtimestamp without time zoneです。デフォルト値はnow()です。タイムスタンプ列をJPA型にマップする方法は?

このテーブルのEntityクラスを使用してデータを取得するときに問題が発生します。 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フィールドに正しく入力されます。 OK ...これは問題を絞り込みます。

答えて

11

私は正確に問題を解決しませんでしたが、私はそれを中心に働きました。代わりに、データベースの供給に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がなぜデータベースに適用されたデフォルト値で更新されなかったのかまだ分かりません。値がまだnullであると思って立ち往生しました。

2

はこれを試してみてください:

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

私はそれを試しましたが、行っていません。フィールドはまだデータベースからヌルに戻ってきています。 – slattery

+0

これを試してください。 '@Column(name =" create_at "、insertable = false、nullable = false)' –

+0

あなたのクエリはどうですか? '@Column(name =" create_at "、insertable = false、columnDefinition =" now() ")' –

関連する問題