2012-05-30 10 views
16

Używam WebSphere 7 (Java EE 5) i OpenJPA 1.2.1.jak przechowywać datę i czas z JPA w Oracle?

Mam obiektu WZP z atrybutem „modifiedTimestamp”, coś takiego:

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

Związana z pola w bazie danych Oracle jest typu DATE.

ustawić datę jak tak ...

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

... i to zostanie zapisane, ale kiedy czytam je z powrotem czas dnia nie zostało zapisane, że pozwala wraca jako 24 : 00.

Czy to jest rzecz WZP, czy sprawa Wyroczni? Wszelkie sugestie są bardzo mile widziane!

Dzięki

+0

która implementacja jpa? –

+0

Dobre pytanie - używam WebSphere 7 (Java EE 5) i OpenJPA 1.2.1. –

+1

java.sql.Date przechowuje tylko datę, zgodnie z jej javadocs. Być może chcesz java.util.Date? – DataNucleus

Odpowiedz

29

Anotating swoje pole i zmieniając typ powinien pomóc:

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

Uwaga: Aby to działało, zmieniłem również pole Oracle na TIMESTAMP zamiast DATE. –

+0

W moim przypadku (Oracle 11g) również działa typ danych DATE w Oracle. – CSchulz

+0

Czy "Kalendarz" nie jest teraz bardziej poprawny? –

11

Zastosowanie @Temporal(TemporalType.TIMESTAMP) (Javadocs). W połączeniu with java.util.Date.

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

Dzięki @AnthonyAccioly, chciałbym oznaczyć to poprawnie, Eelke pokonał twoją sprawę w kilka sekund. :) –

+0

Dzięki @AnthonyAccioly, w moim przypadku brakowało adnotacji z kolumny i zostało to naprawione za pomocą Twojej sugestii. – MauricioTL

1

Jeśli zmienić typ do java.sql.Timestamp następnie również powinno działać bez dodawania @Temporal annotaion.

private java.sql.Timestamp modifiedTimestamp; 

Oczywiście w polu Oracle zmień wartość na TIMESTAMP.

1

W ten sposób obsługuję pole datetime w Javie, MySQL db i OpenJPA2. Chcę, aby pole było typem java.util.Calendar, datetime dbfield i dbvalue jako wartości UTC. Mysql nie wie nic o strefie czasowej, więc użycie niestandardowego konwertera może ustawić i odczytać ciąg "yyyy-MM-dd HH: mm: ss". Wciąż jest to poprawna kolumna sql datetime i java.util.Calendar w komponencie bean obiektu.

@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 jest moją klasą losowego wykorzystania, aby zapewnić kilka podstawowych konwersji.

Powiązane problemy