2013-03-01 47 views
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 

如果我提交时间戳设置窗体手动,一切都好。

回答

1

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

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

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