2009-11-09 107 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对象并在需要保存的地方使用它。 在这个类中你可以添加你需要的所有逻辑。