2009-11-09 104 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 2009-11-09 21:27:15

+0

我編輯了我的問題。我發佈了用於在數據庫中插入對象的方法。我從會話bean中插入對象。 – Attilah 2009-11-10 07:47:40

回答

0

我會建議使用DAO設計模板。基本上你只需創建一個類,它將保存Canal對象並在需要保存的地方使用它。 在這個類中你可以添加你需要的所有邏輯。