last modified by und last modified date

ARadauer

Top Contributor
hi,
arbeite seit ein paar tagen an einem neuen projekt, mit tapestry und hibernate.

Hab jetzt die Aufgabe bekommen, eine Funktionalität zu entwicklen, dass wenn eine Entität ein spezielles Interface implementiert, der Zeitpunkt der letzten Änderung und User gespeichert wird...

Ok... hat jemand sowas schon gemacht?
Kapitel 12.3.2 Intercepting Hibernate events und 12.3.3 The core event system in Java-Persistence-Hibernate
Java Persistence with Hibernate: Amazon.de: Christian Bauer, Gavin King: Englische Bücher

schauen ganz gut aus ... geht das in die richtige Richtung oder würdet ihr mir da was anders empfehlen um das setzen des Datums an eine zentrale Stelle zu verschieben?

Ich versteh auch den Unterschied noch nicht ganz... einen Interceptor oder ein eigenen PreUpdateEventListener... was hat welche Vorteile?
 

ARadauer

Top Contributor
ok... ich mach das jetzt mit PreInsertEventListener und PreUpdateEventListener

beim preUpdate klappt das wunderbar...
Java:
	public boolean onPreUpdate(PreUpdateEvent event)
	{
		if(event.getEntity() instanceof ModificationPersistable){
			ModificationPersistable entity = (ModificationPersistable) event.getEntity();
			entity.setLastModifiedDate(new Date());			
		}
		return false;		
	}

beim insert klappte es aber nicht, der wert wurde einfach nicht gespeichert...

das funktionierte dann...

Java:
	public boolean onPreInsert(PreInsertEvent event)
	{
		if(event.getEntity() instanceof ModificationPersistable)
		{
			ModificationPersistable entity = (ModificationPersistable) event.getEntity();
			event.getState()[ArrayUtils.indexOf(event.getPersister().getPropertyNames(), "lastModifiedDate")] = new Date();
		}
		return false;
	}
von hier https://forum.hibernate.org/viewtopic.php?t=940572
kann mir jemand sagen warum?

die jpa variante mit der annotierten methode kann ich leider nicht benutzen, da ich da eine methode in der entity brauche dir mir das macht, ich aber über ein interface arbeiten muss
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
jetzt mal von den pre events betrachtet:
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/package-frame.html
das sind die vier
PreDeleteEventListener
PreInsertEventListener
PreLoadEventListener
PreUpdateEventListener


meine Klasse sieht jetzt so aus:

Java:
public class ModificationPersistableEntityListener implements PreInsertEventListener, PreUpdateEventListener 
{

	private static final long serialVersionUID = 5673756827403724822L;

	public boolean onPreInsert(PreInsertEvent event)
	{
		if(event.getEntity() instanceof ModificationPersistable)
		{
			ModificationPersistable entity = (ModificationPersistable) event.getEntity();
			entity.setLastModifiedDate(new Date());
			/* it's not working, tell me if you know why */
			//https://forum.hibernate.org/viewtopic.php?t=940572			
			event.getState()[ArrayUtils.indexOf(event.getPersister().getPropertyNames(), "lastModifiedDate")] = new Date();
		}
		return false;
	}

	public boolean onPreUpdate(PreUpdateEvent event)
	{
		if(event.getEntity() instanceof ModificationPersistable){
			ModificationPersistable entity = (ModificationPersistable) event.getEntity();
			entity.setLastModifiedDate(new Date());			
		}
		return false;		
	}
}

Hibernate ist da leider sehr penibel, was seine funktionen angeht... ein Insert ist kein Update,
ja ist mir klar... aber er kommt ja in die onPreInsert Methode rein

aber ich muss dann dieses komische event.getState()[ArrayUtil... Dings machen, dass der Wert wirklcih in der Datenbank steht... beim update brauch ich das nicht... das verwirrt mich....

ich seh mir jetzt den SaveOrUpdateEventListener noch an...
 

Firestorm87

Bekanntes Mitglied
aber ich muss dann dieses komische event.getState()[ArrayUtil... Dings machen, dass der Wert wirklcih in der Datenbank steht... beim update brauch ich das nicht... das verwirrt mich....

ich seh mir jetzt den SaveOrUpdateEventListener noch an...
Sorry, dann hatte Ich dich falsch verstanden.
Ich dachte, dass er die Methode dann gar nicht ausführt....

Bin dann mal auf die Resultate von SaveOrUpdate gespannt....
 
G

Gelöschtes Mitglied 5909

Gast
Hibernate implementiert doch sweot ich weiß auch JPA2.0 (zumindest die neueren versionen)

Was spricht gegen EntityListener? Dann bist du auch JPA konform und musst dich nicht mit den Hibernate Events rumschlagen

EntityListenerJPAJava Tutorial

Ich hab sowas ähnliches, etwas komplexer auch schon gemacht, habe mir dafür aber einen Service gebaut. (ging nicht mit den Listenern, da war noch viel mehr logik)
Außerdem verbietet eine Historisierung ja deletes...


Hier gibts noch was:
Automatische Historisierung mit Hibernate Envers
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Oben