java - Updating a Hibernate entity via an EventListener -
i'm using preinsert , preupdate eventlisteners in hibernate set value of "created" , "updated" timestamps prior writing entity database. problem next time hibernate reads flushes entity hibernate sees changed timestamps , thinks object needs updated if nothing else changed. listeners fired again, update occurs, , same on , over.
ideally i'd able assign these timestamps without hibernate thinking object dirty next time flushed. best solution handling this? assume override dirty check, wanted see others do.
here's example code reference (this sample code no need nitpick):
@entity class myentity { @id long id = long.valueof(1); @temporal(temporaltype.timestamp) private date created; @temporal(temporaltype.timestamp) private date updated; @override public void setcreated(date created) { this.created = created; } @override public void setupdated(date updated) { this.updated = updated; } } public class preinsertandupdateeventlistener implements preinserteventlistener, preupdateeventlistener { @override public boolean onpreupdate(preupdateevent event) { myentity.class.cast(event.getentity()).setupdated(new date()); return false; } @override public boolean onpreinsert(preinsertevent event) { myentity.class.cast(event.getentity()).setcreated(new date()); return false; } } public void updatedtest() { session session = sessionfactory.opensession(); transaction t = session.begintransaction(); myentity p = new myentity(); serializable id = session.save(p); session.flush(); (int = 0; < 5; i++) { p = (myentity) session.get(myentity.class, id); session.update(p); session.flush(); // update fires here } t.commit(); session.close(); }
the solution decided take update hibernate's state match of entity each time modify entity via event listener. implementation looks this:
standardproperty[] properties = event.getpersister().getentitymetamodel().getproperties(); object[] state = event.getstate(); (int = 0; < properties.length; i++) { if (properties[i].getname().equals("updated")) { state[i] = timestamp; break; } }
Comments
Post a Comment