Note that there are some explanatory texts on larger screens.

plurals
  1. POOwn Hibernate DefaultSaveOrUpdateEventListener is not getting fired when using .save() or .update() instead of .saveOrUpdate()
    text
    copied!<p>im trying to build a spring (3.1) &amp; hibernate (3.6.10) web application and having a problem with the hibernate events. I implemented my own DefaultSaveOrUpdateEventListener for updating/creating a dateCreated and lastUpdated date which is called on every .saveOrUpdate() event. So far so good.</p> <p>Shouldn't this listener be called also on .save() or .update() events? Or am i missing something here?</p> <p>Listener:</p> <pre><code>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); } } </code></pre> <p>Hibernate config (partially):</p> <pre><code>&lt;sesssion-factory&gt; &lt;event type="save-update"&gt; &lt;listener class="net.test.listener.hibernate.SaveOrUpdateDateListener"/&gt; &lt;listener class="org.hibernate.event.def.DefaultSaveOrUpdateEventListener"/&gt; &lt;/event&gt; &lt;/session-factory&gt; </code></pre> <p>example dao methods (<strong>doesn't work</strong>):</p> <pre><code>@Autowired private SessionFactory sessionFactory; @Override public void add(Registration registration) { sessionFactory.getCurrentSession().save(registration); } @Override public void update(Registration registration) { sessionFactory.getCurrentSession().update(registration); } </code></pre> <p>example dao methods (<strong>works</strong>):</p> <pre><code>@Autowired private SessionFactory sessionFactory; @Override public void add(Registration registration) { sessionFactory.getCurrentSession().saveOrUpdate(registration); } @Override public void update(Registration registration) { sessionFactory.getCurrentSession().saveOrUpdate(registration); } </code></pre> <p><br> <br> <strong>Edit</strong></p> <p>After i dedcided not to use saveOrUpdate in general i hopefully solved my problem with using a base class like the following:</p> <pre><code>@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; } } </code></pre> <p>As the current_timestamp can be used only once per table (mysql restriction) i tried to build the dateCreated via constructor.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload