1

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.

1 Answer 1

1

I've decided to add in annotation class following methods:

@PreUpdate protected void onUpdate() { this.znacznikCzasu = new Date(); } @PrePersist protected void onCreate() { this.znacznikCzasu = new Date(); } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.