2012-05-30 91 views
16

Estoy usando WebSphere 7 (Java EE 5) y OpenJPA 1.2.1.cómo almacenar la fecha Y hora con JPA en Oracle?

que tienen un objeto de la APP con un atributo "modifiedTimestamp", algo como esto:

@Entity 
public class Widget { 
    /* ... */ 
    private java.sql.Date modifiedTimestamp; 
    /* ... */ 
} 

El campo relacionado en la base de datos de Oracle es de tipo DATE.

que determine la fecha como tal ...

myWidget.setModifiedTimestamp(new java.sql.Data(System.currentTimeMillis()); 

... y se almacena, pero cuando leí de nuevo la hora del día no se ha almacenado, permite regresa como 24 : 00.

¿Es esto una cosa JPA, o una cosa de Oracle? ¡Cualquier sugerencia es bienvenida!

Gracias

+0

que jpa implementation? –

+0

Buena pregunta: estoy usando WebSphere 7 (Java EE 5) y OpenJPA 1.2.1. –

+1

java.sql.Date almacena solo la fecha, según sus javadocs. Tal vez quieras java.util.Date? – DataNucleus

Respuesta

29

Anotating su campo y cambiando el tipo debería ayudar:

@Temporal(TemporalType.TIMESTAMP) 
private java.util.Date modifiedTimestamp; 
+0

Nota: Para que funcione también cambié el campo de Oracle a TIMESTAMP en lugar de DATE. –

+0

En mi caso (Oracle 11g), el tipo de datos DATE en Oracle también está funcionando. – CSchulz

+0

¿'Calendar' no es más correcto ahora? –

11

Uso @Temporal(TemporalType.TIMESTAMP) (Javadocs). Combinado with java.util.Date.

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "DATE_FIELD") 
private java.util.Date modifiedTimestamp; 
+0

Gracias @AnthonyAccioly, me gustaría marcarlo correctamente por Eelke vencer en cuestión de segundos. :) –

+0

Gracias @AnthonyAccioly, la anotación de columna faltaba en mi caso y se corrigió con su sugerencia. – MauricioTL

1

Si cambia el tipo de java.sql.Timestamp entonces también debería funcionar, sin añadir @Temporal annotaion.

private java.sql.Timestamp modifiedTimestamp; 

Por supuesto en el campo de cambio de Oracle a un TIMESTAMP.

1

Así es como manejo el campo de fecha y hora en Java, MySQL db y OpenJPA2. Quiero que el campo sea un tipo de java.util.Calendar, dbfield datetime y dbvalue como valor UTC. Mysql no sabe nada sobre la zona horaria, por lo que al usar un convertidor personalizado se puede configurar y leer la cadena "aaaa-MM-dd HH: mm: ss". Todavía es válida la columna sql de fecha y hora y java.util.Calendar en bean de entidad.

@Entity @Table(name="user") @Access(AccessType.FIELD) 
public class User { 
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id; // primary key (autogen surrogate) 

    private String name; 

    @Column(name="updated_utc") // use custom serializer so that UTC-stringified 
    @Temporal(TemporalType.TIMESTAMP) // db datetime is properly set to calendar instance 
    @Factory("JPAUtil.db2calendar") @Externalizer("JPAUtil.calendar2db") 
    private Calendar updated; 

    public long getId() { return id; } 
    public void setId(long id) { this.id = id; } 

    public String getName() { return name; } 
    public void setName(String name) { this.name=name; } 

    public Calendar getUpdated() { return updated; } 
    public void setUpdated(Calendar cal) { updated=cal; } 

} 

- - - 

public class JPAUtil { 
    public static final TimeZone TIMEZONE_UTC = TimeZone.getTimeZone("UTC"); 

    public static String calendar2db(Calendar val, StoreContext ctx) { 
     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     df.setTimeZone(TIMEZONE_UTC); 
     return df.format(cal.getTime()); // return date as UTC string value 
    } 

    public static Calendar db2calendar(String val, StoreContext ctx) { 
     try { 
      // returned calendar is using a default timezone, val was set as utc string 
      return DateUtil.parseDateTimeFromUTC(val); 
     } catch (Exception ex) { 
      return null; 
     } 
    } 

} 

- - - 

CREATE TABLE user (
    id bigint NOT NULL auto_increment, 
    name varchar(64) NOT NULL default '', 
    updated_utc datetime NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY USERNAME (name) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

ps: DateUtil es mi clase de utilidad aleatoria para proporcionar algunas conversiones básicas.

Cuestiones relacionadas