Как сохранить дату и время с помощью JPA в Oracle?

Я использую WebSphere 7 (Java EE 5) и OpenJPA 1.2.1.

У меня есть объект 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? Любые предложения приветствуются!

Спасибо

Ответ 1

Анимация вашего поля и изменение типа должны помочь:

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

Ответ 2

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

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

Ответ 3

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

private java.sql.Timestamp modifiedTimestamp; 

Конечно, в поле изменения Oracle в TIMESTAMP.

Ответ 4

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

@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 для предоставления некоторых базовых преобразований.