Hibernate - 在预插入/预更新时更新实体

时间:2013-03-01 07:58:45

标签: java hibernate entity listener

我想设置最后一个对象modify / create的时间戳,所以我想创建一个预插入和预创建的侦听器并将它们链接到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;
    }
}

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(timestamp)字段的表单时,它变为null并且不会被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

如果我提交一个手动设置了时间戳的表单,那就一切正常。

1 个答案:

答案 0 :(得分:1)

我决定在以下方法中添加注释类:

@PreUpdate
  protected void onUpdate() {
    this.znacznikCzasu = new Date();
  }

 @PrePersist
  protected void onCreate() {
     this.znacznikCzasu = new Date();
  }