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 )を使用します。組み合わせ with Java.util.Date 。
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DATE_FIELD")
private Java.util.Date modifiedTimestamp;
タイプをJava.sql.Timestamp
に変更すると、@Temporal
アノテーションを追加しなくても機能します。
private Java.sql.Timestamp modifiedTimestamp;
もちろん、OracleではフィールドをTIMESTAMPに変更します。
これは、Java、MySQL db、OpenJPA2で日時フィールドを処理する方法です。フィールドをJava.util.Calendar、dbfield datetime、およびdbvalueのタイプとしてUTC値にしたい。 Mysqlはタイムゾーンについて何も認識しないため、カスタムコンバーターを使用して「yyyy-MM-dd HH:mm:ss」文字列を設定および読み取ることができます。それでも、その有効な日時SQL列とエンティティBeanの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クラスです。