2012-06-18 1 views
4

im пытается построить весну (3.1) & hibernate (3.6.10) веб-приложение и имеет проблему с события спячки. Я применил свой собственный DefaultSaveOrUpdateEventListener для обновления/создания dateCreated и lastUpdated date, который вызывается для каждого события .saveOrUpdate(). Все идет нормально.Собственный спящий режим DefaultSaveOrUpdateEventListener не запускается при использовании .save() или .update() вместо .saveOrUpdate()

Не следует ли вызывать этот слушатель также на событиях .save() или .update()? Или я что-то упустил?

Слушатель:

public class SaveOrUpdateDateListener extends DefaultSaveOrUpdateEventListener { 

    private static final long serialVersionUID = 1L; 

    private static Logger log = Logger.getLogger(SaveOrUpdateDateListener.class); 


    @Override 
    public void onSaveOrUpdate(SaveOrUpdateEvent event) { 
     log.debug("Entered onSaveOrUpdate()"); 

     if (event.getObject() instanceof BaseDomain) { 
      BaseDomain record = (BaseDomain) event.getObject(); 

      record.setDateUpdated(new Date()); 

      if (record.getDateCreated() == null) { 
       record.setDateCreated(new Date()); 
      } 
     } 

     super.onSaveOrUpdate(event); 
    } 
} 

спящий режим конфигурации (частично):

<sesssion-factory> 

<event type="save-update"> 
      <listener class="net.test.listener.hibernate.SaveOrUpdateDateListener"/> 
      <listener class="org.hibernate.event.def.DefaultSaveOrUpdateEventListener"/> 
     </event>  
</session-factory> 

методы Пример DAO (не работает):

@Autowired 
private SessionFactory sessionFactory; 


@Override 
public void add(Registration registration) { 
    sessionFactory.getCurrentSession().save(registration); 
} 

@Override 
public void update(Registration registration) { 
    sessionFactory.getCurrentSession().update(registration); 
} 

методы Пример дао (работы):

@Autowired 
private SessionFactory sessionFactory; 


@Override 
public void add(Registration registration) { 
    sessionFactory.getCurrentSession().saveOrUpdate(registration); 
} 

@Override 
public void update(Registration registration) { 
    sessionFactory.getCurrentSession().saveOrUpdate(registration); 
} 



Редактировать

После того как я dedcided не использовать saveOrUpdate вообще я надеюсь, решить мою проблему с использованием базового класса, как в следующем:

@MappedSuperclass 
public class BaseDomain { 

    @Id 
    @GeneratedValue 
    protected Integer id; 

    @Column(nullable=false) 
    protected Timestamp dateCreated; 

    @Column(updatable = false, insertable = false, columnDefinition = "timestamp default current_timestamp on update current_timestamp") 
    @Generated(GenerationTime.ALWAYS) 
    protected Timestamp dateUpdated; 


    protected BaseDomain() { 
     this.dateCreated = new Timestamp(System.currentTimeMillis()); 
    } 

    public Integer getId() { 
     return id; 
    } 

    protected void setId(Integer id) { 
     this.id = id; 
    } 

    public Timestamp getDateCreated() { 
     return dateCreated; 
    } 

    public Date getDateUpdated() { 
     return dateUpdated; 
    } 
} 

в качестве current_timestamp может использоваться только один раз для таблицы (ограничение mysql). Я попытался создать dateCreated через конструктор.

ответ

5

События сохранения обновления происходят только в результате вызова saveOrUpdate. Save-update - это не какие-то комбинации сохранения, обновления. и saveOrUpdate.

В documentation это пишется следующим образом:

14.2. Система событий
...
Все методы интерфейса сеанса коррелируют с событием.
...
Когда запрос сделан из одного из этих методов, сеанс Hibernate генерирует соответствующее событие и передает его на сконфигурированное событие слушателей для этого типа.

Смежные вопросы