2011-12-16 13 views
6

¡Estoy usando Play! 1.2.4 y PostgreSQL 9.1. Creé una tabla con una columna created_at, del tipo: timestamp without time zone. Tiene un valor predeterminado de now().¿Cómo se asigna la columna de marca de tiempo al tipo de JPA?

El problema surge cuando obtengo datos usando mi clase Entity para esta tabla. El campo createdAt siempre regresa null. Aquí está la definición de campo:

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

Todos los demás campos se completan correctamente. He intentado cambiar el tipo de campo a Date, Calendar, Timestamp, etc., e intenté agregar una anotación @Timestamp. Pero ninguna combinación ha resultado exitosa.

¡Gracias de antemano por cualquier ayuda!

Como referencia, aquí está el DDL que utilicé para crear la tabla.

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

Actualización: creo que el problema tiene que ver con el uso de la APP para insertar un registro. La base de datos rellena un valor predeterminado de now() para created_at, pero de alguna manera Hibernate no lo sabe al recuperar esa fila.

Si consulto una fila que ya existía, el campo createdAt está lleno correctamente. OK ... esto reduce el problema.

Respuesta

11

que no resolvió el problema exactamente, pero he trabajado alrededor de ella.

En lugar de tener la base de datos suministra el valor predeterminado de now(), me lo expresó en JPA con @PrePersist:

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

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

que funciona muy bien! Inspiración tomada desde this answer. Todavía no estoy seguro de por qué Hibernate no se actualizó con el valor predeterminado que se aplicó en la base de datos. Estaba atascado pensando que el valor todavía era nulo.

2

Prueba esto:

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

Lo intenté, pero no voy. El campo aún regresa nulo desde la base de datos. – slattery

+0

Pruebe esto entonces '@Column (name =" create_at ", insertable = false, nullable = false)' –

+0

¿Cómo es su consulta? o intente esto también: '@Column (name =" create_at ", insertable = false, columnDefinition =" now() ")' –

Cuestiones relacionadas