I want to set timestamp of last object modify/create, so I though to create an pre-insert and pre-create listeners and link them to Hibernate:
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; } } piece of Uczen.java:
@Temporal(TemporalType.TIME) @Column(name = "znacznik_czasu") public Date getZnacznikCzasu() { return this.znacznikCzasu; } public void setZnacznikCzasu(Date znacznikCzasu) { this.znacznikCzasu = znacznikCzasu; } in postgresql database it has not-null limitation
persistence-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" /> The problem is, when I submit a form without znacznikCzasu (timestamp) field, it becomes null and isn't replaced by set new Date()
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 If I submit a form with timestamp set manually, it's everything ok.