1
我想設置最後一個對象的時間戳修改/創建更新的實體,所以我雖然創建一個預插入和預創建監聽器並將其鏈接到休眠:休眠 - 在插入前/預更新
public class UpdateInsertListener implements PreInsertEventListener, PreUpdateEventListener {
@Override
public boolean onPreInsert(PreInsertEvent arg0) {
setCurrentTimestamp(arg0.getEntity());
arg0.getSession().save(arg0.getEntity());
return false;
}
private void setCurrentTimestamp(Object uczenEntity) {
System.out.println("Setting timestamp: " + new Date());
if (uczenEntity instanceof Uczen) {
Uczen uczen = (Uczen)uczenEntity; // uczen = student
uczen.setZnacznikCzasu(new Date()); // znacznikCzasu = timestamp
}
}
@Override
public boolean onPreUpdate(PreUpdateEvent arg0) {
setCurrentTimestamp(arg0.getEntity());
arg0.getSession().save(arg0.getEntity());
return false;
}
}
片Uczen.java的:
@Temporal(TemporalType.TIME)
@Column(name = "znacznik_czasu")
public Date getZnacznikCzasu() {
return this.znacznikCzasu;
}
public void setZnacznikCzasu(Date znacznikCzasu) {
this.znacznikCzasu = znacznikCzasu;
}
在PostgreSQL數據庫
它具有非空限制
持久性dev.xml:
<property name="hibernate.validator.autoregister_listeners" value="false" />
<property name="hibernate.ejb.event.pre-insert" value="pl.praktyki.validator.UpdateInsertListener" />
<property name="hibernate.ejb.event.pre-update" value="pl.praktyki.validator.UpdateInsertListener" />
問題是,當我提交表單,而不znacznikCzasu(時間戳)字段,就變成空,而不是通過設定新的日期()代替
08:24:12,297 INFO [STDOUT] Hibernate:
select
praktyka0_.id as id26_,
praktyka0_.data_koniec as data2_26_,
praktyka0_.data_poczatek as data3_26_,
praktyka0_.nazwa as nazwa26_,
praktyka0_.opis as opis26_,
praktyka0_.znacznik_czasu as znacznik6_26_
from
praktyka.public.praktyka praktyka0_ limit ?
08:24:20,250 INFO [STDOUT] Setting timestamp: Fri Mar 01 08:24:20 CET 2013
08:24:20,251 INFO [STDOUT] Hibernate:
insert
into
praktyka.public.uczen
(imie, nazwisko, opis, id_praktyka, znacznik_czasu, id)
values
(?, ?, ?, ?, ?, ?)
08:24:20,252 WARN [JDBCExceptionReporter] SQL Error: 0, SQLState: 23502
08:24:20,252 ERROR [JDBCExceptionReporter] Zadanie wsadowe 0 insert into praktyka.public.uczen (imie, nazwisko, opis, id_praktyka, znacznik_czasu, id) values ('asdasd', 'asdasd', '', '1', NULL, '6') zostało przerwane. Wywołaj getNextException by poznać przyczynę.
// Batch job 0 insert into [..] was interrupted.
08:24:20,252 WARN [JDBCExceptionReporter] SQL Error: 0, SQLState: 23502
08:24:20,252 ERROR [JDBCExceptionReporter] BŁĄD: pusta wartość w kolumnie "znacznik_czasu" narusza ograniczenie wymaganej wartości
Szczegóły: Niepoprawne ograniczenia wiersza (6, 1, asdasd, asdasd, , null).
// ERROR: empty column value "znacznik_czasu" involve limitations of expected value
08:24:20,252 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
如果我提交時間戳設置窗體手動,一切都好。