2011-12-16 1 views
6

Sto usando Play! 1.2.4 e PostgreSQL 9.1. Ho creato una tabella con una colonna created_at, di tipo: timestamp without time zone. Ha un valore predefinito di now().Come mappare la colonna timestamp al tipo JPA?

Il problema si presenta quando recupero i dati utilizzando la mia classe Entity per questa tabella. Il campo viene sempre restituito null. Ecco la definizione del campo:

@Column(name="created_at", insertable=false) 
public java.sql.Date createdAt; 

Tutti gli altri campi sono compilati correttamente. Ho provato a modificare il tipo di campo su Date, Calendar, Timestamp, ecc. E ho provato ad aggiungere un'annotazione @Timestamp. Ma nessuna combinazione ha avuto successo.

Grazie in anticipo per qualsiasi aiuto!

Per riferimento, ecco il DDL che ho usato per creare la tabella.

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) 
); 

Aggiornamento: Penso che il problema ha a che fare con l'utilizzo di APP a inserire un record. Il database inserisce un valore predefinito di now() per created_at, ma in qualche modo Hibernate non ne è a conoscenza quando recupera tale riga.

Se si interroga una riga già esistente, il campo createdAt viene compilato correttamente! OK ... questo limita il problema.

risposta

11

non ha risolto il problema esattamente, ma ho lavorato intorno ad esso.

Invece di avere il database fornisce il valore predefinito di now(), ho espresso in JPA con @PrePersist:

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

@PrePersist 
protected void onCreate() { 
    createdAt = new Date(); 
} 

Che funziona bene! Ispirazione presa da this answer. Non sono ancora sicuro del motivo per cui Hibernate non è stato aggiornato con il valore predefinito applicato nel database. Era bloccato pensando che il valore fosse ancora nullo.

2

Prova questa:

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

Ho provato, ma non andare. Il campo sta ancora ritornando null dal database. – slattery

+0

Prova questo poi '@Column (name =" create_at ", insertable = false, nullable = false)' –

+0

Qual è la tua richiesta? oppure prova anche questo: '@Column (name =" create_at ", insertable = false, columnDefinition =" now() ")' –