如何在Oracle中使用JPA存储日期和时间?

我正在使用WebSphere 7(Java EE 5)和OpenJPA 1.2.1。

我有一个带有“ modifiedTimestamp ”属性的JPA对象,如下所示:

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

Oracle数据库中的相关字段的类型为DATE

我这样设定日期……

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

…并且它被存储,但是当我读回它时,时间没有被存储,它允许返回到24:00。

这是JPA的东西,还是Oracle的东西? 任何建议都非常感谢!

谢谢

调整字段并更改类型应该有助于:

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

使用@Temporal(TemporalType.TIMESTAMP) ( Javadocs )。 结合java.util.Date 。

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

如果您将类型更改为java.sql.Timestamp那么它也应该工作,而不添加@Temporal annotaion。

 private java.sql.Timestamp modifiedTimestamp; 

当然在Oracle将字段更改为TIMESTAMP。

这就是我在Java,MySQL db和OpenJPA2中处理datetime字段的方法。 我希望field是一种java.util.Calendar,dbfield datetime和dbvalue作为UTC值。 Mysql对时区一无所知,所以使用自定义转换器可以设置和读取“yyyy-MM-dd HH:mm:ss”字符串。 仍然是它在实体bean中的有效日期时间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是我的随机util类,提供一些基本的转换。