2016-07-27 23 views
1

Ich versuche Interzeptoren in meinem Frühling + Winterschlafcode zu verwenden.Hibernate Interceptor funktioniert nicht

Die inceptor Definition ist wie folgt:

public class myInterceptor extends EmptyInterceptor{ 

private static final long serialVersionUID = 1L; 
Session session; 

public void setSession(Session session) { 
    this.session=session; 
} 

public boolean onSave(Object entity,Serializable id, 
    Object[] state,String[] propertyNames,Type[] types) 
    throws CallbackException { 
    System.out.println("onSave"); 
    return false; 
} 

public boolean onFlushDirty(Object entity,Serializable id, 
    Object[] currentState,Object[] previousState, 
    String[] propertyNames,Type[] types) 
    throws CallbackException { 
    System.out.println("onFlushDirty"); 
    return false; 
} 

public void onDelete(Object entity, Serializable id, 
    Object[] state, String[] propertyNames, 
    Type[] types) { 
    System.out.println("onDelete");  
} 

//called before commit into database 
public void preFlush(Iterator iterator) { 
    System.out.println("preFlush"); 
} 

//called after committed into database 
public void postFlush(Iterator iterator) { 
    System.out.println("postFlush");  
    }   
} 

und meine Abfangjäger Konfiguration und Verwendung in dao Klasse mit dao Unterstützung Hibernate erweitern

myInterceptor interceptor = new myInterceptor(); 
    SessionFactory sessionFactory = getSessionFactory(); 
    SessionBuilder sessionBuilder = sessionFactory.withOptions(); 
    Session session = sessionBuilder.interceptor(interceptor).openSession(); 
    interceptor.setSession(session); 

    Transaction tx = session.beginTransaction(); 

    session.merge(member); 
    tx.commit(); 
    session.close(); 

ist (ich Session Konfiguration anstatt zu dieser)

Das erste Problem ist, dass die Funktionen meines Abfängers nicht funktionieren außer preFlush und postFlush!

Das zweite Problem ist, wie ich diesen Interceptor als SessionFactory allgemeine Konfiguration verwenden kann, aber nur an meinem spezifischen Objekt und nicht allen Objekten arbeiten.

+0

Bitte teilen EmptyInterceptor Code –

+0

@NarendraPandey Es ist in org.hibernate Paket und es ist nicht mein Code. –

Antwort

1

Ihre Interceptor-Methoden onSave, onFlushDirty und onDelete werden in Ihrem Code nicht aufgerufen, da Sie keine Entitäten hinzufügen, ändern oder löschen. Versuchen Sie, verwaltete Entitäten zu erstellen, zu ändern und zu löschen, und es wird funktionieren.

Sie können den Interceptor für bestimmte Entitäten nicht konfigurieren; Sie müssen instanceofs oder getClass(). isAssignableFrom() oder like in Ihren jeweiligen Methoden codieren, um das Verhalten auf diese zu beschränken.

+0

Ich habe versucht, die Interceptor-Klasse zu implementieren, statt den leeren Intercepter zu erweitern, und schließlich hat es funktioniert! Tnx für die Beantwortung der zweiten Frage. Es war hilfreich. –