Ответ 1
Анимация вашего поля и изменение типа должны помочь:
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date modifiedTimestamp;
Я использую 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? Любые предложения приветствуются!
Спасибо
Анимация вашего поля и изменение типа должны помочь:
@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.
Вот как я обрабатываю поле 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 для предоставления некоторых базовых преобразований.