2012-05-30 3 views
16

Я использую WebSphere 7 (Java EE 5) и OpenJPA 1.2.1.Как хранить дату и время с JPA в Oracle?

У меня есть объект JPA с «modifiedTimestamp» атрибут, что-то вроде этого:

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

Связанное поле в базе данных Oracle имеет тип DATE.

я установить дату, как так ...

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

... и она будет храниться, но когда я прочитал его обратно время суток не был сохранен, он позволяет возвращается как 24 : 00.

Это вещь JPA или вещь Oracle? Любые предложения приветствуются!

Благодаря

+0

который jpa осуществление? –

+0

Хороший вопрос - я использую WebSphere 7 (Java EE 5) и OpenJPA 1.2.1. –

+1

java.sql.Date хранит только дату, согласно ее javadocs. Возможно, вам нужен java.util.Date? – DataNucleus

ответ

29

Anotating ваше поле и изменение типа должно помочь:

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

Примечание. Чтобы он работал, я также изменил поле Oracle на TIMESTAMP вместо DATE. –

+0

В моем случае (Oracle 11g) также работает тип данных DATE в Oracle. – CSchulz

+0

«Календарь» теперь не правильный? –

11

Использование @Temporal(TemporalType.TIMESTAMP) (Javadocs). Комбинированный with java.util.Date.

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

Спасибо @ AnthonyAccioly, я бы хотел отметить это правильно, потому что Eelke избил вас на несколько секунд. :) –

+0

Благодаря @AnthonyAccioly, аннотация Колонки отсутствовала в моем случае и исправлена ​​с вашим предложением. – MauricioTL

1

Если вы измените тип на java.sql.Timestamp то и он должен работать без добавления @Temporal annotaion.

private java.sql.Timestamp modifiedTimestamp; 

Конечно, в Oracle меняйте поле на TIMESTAMP.

1

Вот как я обрабатываю поле datetime в Java, MySQL db и OpenJPA2. Я хочу, чтобы поле было типом java.util.Calendar, datfield datetime и dbvalue как значение UTC. Mysql ничего не знает о часовом поясе, поэтому использование настраиваемого конвертера может установить и прочитать строку «yyyy-MM-dd HH: mm: ss». Тем не менее, его действительный столбец sql-времени и java.util.Calendar в сущности-компоненте.

@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 - мой случайный класс использования, чтобы обеспечить некоторые базовые преобразования.

Смежные вопросы