2012-05-30 10 views
16

Sto utilizzando WebSphere 7 (Java EE 5) e OpenJPA 1.2.1.come memorizzare data e ora con JPA in Oracle?

Ho un oggetto JPA con un attributo "modifiedTimestamp", qualcosa di simile:

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

Il campo correlato nel database Oracle è di tipo DATE.

ho impostare la data in questo modo ...

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

... e viene memorizzato, ma quando ho letto di nuovo l'ora del giorno non è stato memorizzato, permette ritorna come 24 : 00.

Questa è una cosa JPA o una cosa Oracle? Ogni suggerimento è molto apprezzato!

Grazie

+0

quale implementazione jpa? –

+0

Buona domanda: sto utilizzando WebSphere 7 (Java EE 5) e OpenJPA 1.2.1. –

+1

java.sql.Date memorizza solo la data, come per i suoi javadoc. Forse vuoi java.util.Date? – DataNucleus

risposta

29

Anotating tuo campo e cambiando il tipo dovrebbe aiutare:

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

Nota: per farlo funzionare, ho anche modificato il campo Oracle in un TIMESTAMP anziché DATE. –

+0

Nel mio caso (Oracle 11g) funziona anche il datatype DATE in Oracle. – CSchulz

+0

Ora 'Calendar' non è più corretto? –

11

Usa @Temporal(TemporalType.TIMESTAMP) (Javadocs). Combinato with java.util.Date.

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

Grazie a @AnthonyAccioly, mi piacerebbe contrassegnarlo corretto da Eelke battere il tuo da una questione di secondi. :) –

+0

Grazie @AnthonyAccioly, l'annotazione Colonna mancava nel mio caso e risolta con il tuo suggerimento. – MauricioTL

1

Se si cambia il tipo di java.sql.Timestamp poi anche essa dovrebbe funzionare, senza l'aggiunta di @Temporal annotaion.

private java.sql.Timestamp modifiedTimestamp; 

Ovviamente in Oracle cambia campo in un TIMESTAMP.

1

Ecco come gestisco il campo datetime in Java, MySQL db e OpenJPA2. Voglio che il campo sia un tipo di java.util.Calendar, dbfield datetime e dbvalue come valore UTC. Mysql non sa nulla del fuso orario, quindi l'uso di un convertitore personalizzato può impostare e leggere la stringa "yyyy-MM-dd HH: mm: ss". Ancora la sua colonna sql datetime valida e java.util.Calendar nel bean di entità.

@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 è la mia classe di utilizzo casuale per fornire alcune conversioni di base.