-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 9 posts ] 
Author Message
 Post subject: Interceptor und Listener
PostPosted: Tue Apr 22, 2008 10:37 am 
Newbie

Joined: Tue Apr 22, 2008 8:41 am
Posts: 5
Hallo ich habe folgendes problem:

Ich möchte Daten historisieren/archivieren und zwar so, dass aus einer tabelle der datensatz genomenm wird und in einer anderen tabelle eingefügt wird, mit dem zusätzlichen Eintrag Timestamp(Datum) und dem Benutzer(wer hat es geändert/eingefügt)!

z.B.: Tabelle Kunde

Name Vorname Alter Geschlecht
=========================
Beier Johannes 15 M

Tabelle KundenHistory

Name Vorname Alter Geschlecht USER Changedate
=========================================
Beier Johannes 15 M System 20080421

Nach 2 Stunden erfolgt ein Update des Satzes und dabei soll folgendes passieren.

z.B.: Tabelle Kunde (Alter wurde von 15->300 geändert)

Name Vorname Alter Geschlecht
=========================
Beier Johannes 300 M

Tabelle KundenHistory (ein neuer Eintrag wird in der tabelle eingefügt)

Name Vorname Alter Geschlecht USER Changedate
=========================================
Beier Johannes 15 M System 20080421 18:00 Uhr
Beier Johannes 300 M System 20080421 20:00 Uhr


Wie kann ich dies per Hibernate Listener oder Interceptoren lösen?
Hat jemand eine Idee?

Beste Grüße
der Dieter[code][/code]


Top
 Profile  
 
 Post subject:
PostPosted: Sun Apr 27, 2008 6:29 am 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Etwa so:
Code:
public class HistoryInterceptor extends EmptyInterceptor {

(...)

/**
   * Called when an object is detected to be dirty, during a flush. The interceptor may modify the detected
   * <tt>currentState</tt>, which will be propagated to both the database and the persistent object.
   * Note that not all flushes end in actual synchronization with the database, in which case the
   * new <tt>currentState</tt> will be propagated to the object, but not necessarily (immediately) to
   * the database. It is strongly recommended that the interceptor <b>not</b> modify the <tt>previousState</tt>.
   *
   * @return <tt>true</tt> if the user modified the <tt>currentState</tt> in any way.
   */
  @Override
  public boolean onFlushDirty(final Object pEntity,
                              final Serializable pId,
                              final Object[] pCurrentState,
                              final Object[] pPreviousState,
                              final String[] pPropertyNames,
                              final Type[] pTypes) throws CallbackException {
    // there must no exception be uncaught here!

    try {
      final String entityName = pEntity.getClass().getCanonicalName();
(...)


Ich hoffe, das hilft.

Carlo
--------------------------------------
please give me credits if this helped you.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Apr 29, 2008 7:41 am 
Beginner
Beginner

Joined: Wed Apr 23, 2008 12:07 pm
Posts: 22
gibts dazu irgendwo mehr infos? den link
http://www.hibernate.org/156.html
kenne ich bereits. aber ist das nicht ein rießen overhead. warum nicht mit @PrePersist etc. arbeiten? und was ist dieses object[] previousstate...??


Last edited by Abram on Tue Apr 29, 2008 7:57 am, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Tue Apr 29, 2008 7:56 am 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Abram wrote:
gibts dazu irgendwo mehr infos?


Ja, etwas. Ich habe meine Kenntnisse im wesentlichen aus der Hibernate-Bibel von King/Bauer - ein Muß, wenn man mit Hibernate professionell zu tun hat.

Carlo


Top
 Profile  
 
 Post subject:
PostPosted: Tue Apr 29, 2008 7:58 am 
Beginner
Beginner

Joined: Wed Apr 23, 2008 12:07 pm
Posts: 22
da warst du jetzt schneller als ich. ich hab meinen beitrag oben gerade nochmal editiert... :)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Apr 29, 2008 7:58 am 
Beginner
Beginner

Joined: Wed Apr 23, 2008 12:07 pm
Posts: 22
Sch... Doppelposts. Ok egal dann nutz ich den Beitrag hier.

Seh ich es richtig, daß Interceptors die Vorgängervariante der Events waren? Wenn man mit Annotations und dem EntityManager arbeitet, sollte man onPostDelete etc. verwenden?

Ich hab diese Klasse AuditLogListener jetzt mal integriert, mir ist aber nicht klar, wie ich die Events registrieren soll. Ich habe keine hibernate.cfg.xml, nur die persistence.xml.


Top
 Profile  
 
 Post subject:
PostPosted: Sat May 03, 2008 1:33 pm 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Abram wrote:
Ich hab diese Klasse AuditLogListener jetzt mal integriert, mir ist aber nicht klar, wie ich die Events registrieren soll. Ich habe keine hibernate.cfg.xml, nur die persistence.xml.

z.B. so:
Code:
<!-- Interceptor for audit logging -->
<property name="hibernate.ejb.interceptor" value="org.dpjw.history.server.HistoryInterceptor" />


Carlo


Top
 Profile  
 
 Post subject:
PostPosted: Sat May 03, 2008 1:37 pm 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Abram wrote:
und was ist dieses object[] previousstate...??

Das ist der vorige Zustand eines Attributs, so wie currentState[i] der aktuelle Wert ist; propertyNames[i] gibt den Attributnamen.

Carlo


Top
 Profile  
 
 Post subject:
PostPosted: Sat May 03, 2008 2:17 pm 
Beginner
Beginner

Joined: Wed Apr 23, 2008 12:07 pm
Posts: 22
ok scheint jetzt zu funktionieren.

<property name="hibernate.ejb.interceptor" value="package....TimingInterceptor" />

danke :)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 9 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.