2009-11-09 4 views
0

Я написал гибернации перехватчик:Hibernate перехватчики: afterTransactionCompletion

public class MyInterceptor extends EmptyInterceptor { 

private boolean isCanal=false; 

public boolean onSave(Object entity, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException { 

    for(int i=0;i<100;i++){ 
     System.out.println("Inside MyInterceptor(onSave) : "+entity.toString()); 
    } 
    if(entity instanceof Canal){ 
     isCanal=true; 
    } 
    return false; 
} 

public void afterTransactionCompletion(Transaction tx){ 
    if(tx.wasCommitted()&&(isCanal)){ 
     for(int i=0;i<100;i++){ 
      System.out.println("Inside MyInterceptor(afterTransactionCompletion) : Canal was saved to DB."); 
     } 
    } 
} 

Я могу увидеть метод OnSave выполнения хорошо, но метод afterTransactionCompletion никогда не будет выполняться, даже если транзакция успешно поручены к базе данных.

Мне нужен способ отслеживать каждый раз, когда объект канала успешно сохраняется в БД и реагирует, печатая некоторые сообщения. это возможно? и как ?

Вот метод я использую, чтобы сохранить объекты в БД:

public static Object enregObjet(Object obj) throws UpdateException, 
     EnregException, ErreurException { 

Transaction tx = null; 
    try { 
     Session s = InterfaceBD.currentSession(); 
     tx = s.beginTransaction(); 
     try { 
      // Positionner les champs dteUti et dteUtiModif 
      Method dteUtiSetter = null; 
      ; 
      // Objet en insertion 
      dteUtiSetter = obj.getClass().getMethod("setDteUti", 
        new Class[] { java.util.Date.class }); 
      dteUtiSetter.invoke(obj, new Object[] { new java.util.Date() }); 
     } catch (NoSuchMethodException ex) { 
      ;// Le champ dteUtiModif n'existe pas 
     } 
     // Enregistrer 
     IardNum.numeroterCode(obj); 
     IardNum.numeroterId(obj); 
     s.save(obj); 
     s.flush(); 
     tx.commit(); 
     try { 
      String id = ""; 
      // Positionner les champs dteUti et dteUtiModif 
      Method idGetter = null; 
      // Objet en insertion 
      idGetter = obj.getClass().getMethod("getId"); 
      id = (String) idGetter.invoke(obj); 
      Connection conn = InterfaceBD.getConn(); 
      IardGenerator3.cleanSeq(id, conn); 
      conn.close(); 
     } catch (NoSuchMethodException ex) { 
      ;// Le champ dteUtiModif n'existe pas 
     } 
     catch(ClassCastException ex){ 
      ;//just ignore it because we are dealing with a PK class (e.g : CausesAnnexesSinistrePK). 
     } 
     s.clear(); 
     return obj; 
} 
+0

Конфигурирован ли TransactionManager? В каком контейнере вы запускаете это? – mhaller

+0

Я отредактировал мой вопрос. Я опубликовал метод, используемый для вставки объектов в БД. Я вставляю объекты из сеансового компонента. – Attilah

ответ

0

Я предложил бы использовать шаблон дизайна DAO. В основном вы просто создаете класс, который сохранит объект Canal и будет использовать его везде, где вам нужно его сохранить. В этом классе вы можете добавить всю необходимую логику.

Смежные вопросы