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 через конструктор.