перехватчики гибернации: afterTransactionCompletion - PullRequest
0 голосов
/ 09 ноября 2009

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

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 никогда не выполняется, даже если транзакция успешно зафиксирована в базе данных.

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

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

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;
}

1 Ответ

0 голосов
/ 12 ноября 2009

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

...