20

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 のことですか? どんな提案でも大歓迎です!

ありがとう

4

5 に答える 5

36

フィールドに注釈を付けてタイプを変更すると、次のようになります。

@Temporal(TemporalType.TIMESTAMP)
private java.util.Date modifiedTimestamp;
于 2012-05-30T16:02:19.757 に答える
13

@Temporal(TemporalType.TIMESTAMP)( Javadocs )を使用します。java.util.Date と組み合わせる。

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DATE_FIELD")
private java.util.Date modifiedTimestamp;
于 2012-05-30T16:03:19.297 に答える
0

これは、Java、MySQL db、および OpenJPA2 で日時フィールドを処理する方法です。フィールドをjava.util.Calendarのタイプ、dbfield datetime、dbvalueをUTC値にしたい。Mysql はタイムゾーンについて何も知らないので、カスタム コンバーターを使用すると、"yyyy-MM-dd HH:mm:ss" 文字列を設定および読み取ることができます。エンティティ Bean の有効な datetime 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 クラスです。

于 2013-03-27T11:57:24.063 に答える
0

タイプを変更してjava.sql.Timestampも、注釈を追加せずに機能する@Temporalはずです。

private java.sql.Timestamp modifiedTimestamp; 

もちろん、Oracle ではフィールドを TIMESTAMP に変更します。

于 2012-06-01T08:47:02.577 に答える