houyongjun 2009-01-15 11:25
浏览 322
已采纳

PostInsertEventListener 插入发生死循环问题

package com.easou.ad.listener;

import java.util.Date;


import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.collection.PersistentCollection;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostDeleteEventListener;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostInsertEventListener;
import org.hibernate.event.PostUpdateEvent;
import org.hibernate.event.PostUpdateEventListener;

import com.easou.ad.entity.AdOperate;

public class SaveOrUpdateListener implements PostInsertEventListener ,PostUpdateEventListener, PostDeleteEventListener {
    private static final long serialVersionUID = 1L;

    Logger log =  LogManager.getLogger(SaveOrUpdateListener.class);
   
    public void onPostInsert(PostInsertEvent event) {
            AdOperate entry = new AdOperate();
            entry.setType(OperationType.CREATE);
            entry.setDatetime(new Date());
            entry.setEntityName(event.getEntity().getClass().getName());
            saveOperate(event.getSession(), entry);
            log.debug(entry);
    }

  
    public void onPostUpdate(PostUpdateEvent event) {
     
            for (int i = 0; i < event.getState().length; i++) {
                // 更新前的??
                Object oldValue = event.getOldState()[i];
                // 更新后的新???
                Object newValue = event.getState()[i];
                // 跳过集合属???
                if (newValue instanceof PersistentCollection) {
                    continue;
                }
                if (oldValue != null && !oldValue.equals(newValue)) {
                    AdOperate entry = new AdOperate();
                    // 取得属???名??
                    entry.setProperty(event.getPersister().getPropertyNames()[i]);
                    entry.setType(OperationType.UPDATE);
                  
                    // 如果更改的属性是关联对象,则存储其id
                    //if (oldValue instanceof AbstractEntity) {
                    //    entry.setBeforeValue(((AbstractEntity) oldValue).getId().toString());
                    //} else {
                        entry.setBeforeValue(oldValue != null ? oldValue.toString() : null);
                   // }
                    //if (newValue instanceof AbstractEntity) {
                    //    entry.setAfterValue(((AbstractEntity) newValue).getId().toString());
                   // } else {
                        entry.setAfterValue(newValue != null ? newValue.toString() : null);
                   // }
                    entry.setDatetime(new Date());
                    entry.setEntityName(event.getEntity().toString());
                    saveOperate(event.getSession(), entry);
                    log.debug(entry);
                }
            }
           
    }

    public void onPostDelete(PostDeleteEvent event) {
       AdOperate entry = new AdOperate();
          entry.setType(OperationType.DELETE);
          entry.setDatetime(new Date());
          entry.setEntityId(new Long(event.getId().toString()));
          entry.setEntityName(event.getEntity().getClass().getName());
          saveOperate(event.getSession(), entry);
          log.debug(entry);
      
    }
    private void saveOperate(Session session, AdOperate entry) {
        Session tempSession = session.getSessionFactory().openSession();
        Transaction tx = tempSession.beginTransaction();
        try {
            tx.begin();
            tempSession.save(entry);
           // tempSession.flush();
           // tx.commit();
        } catch (Exception ex) {
            tx.rollback();
        }
        tempSession.close();
    }
}

spring的配置

<property name="eventListeners">
   
     <entry key="post-commit-insert"><bean class="com.easou.ad.listener.SaveOrUpdateListener"></entry>
    
     <entry key="post-commit-delete"><bean class="com.easou.ad.listener.SaveOrUpdateListener"></entry>
   
  </property>

 

 

 

结果会插入N条 AdOperate 的记录

  • 写回答

1条回答 默认 最新

  • bohemia 2009-01-15 11:41
    关注

    [code="java"] public void onPostInsert(PostInsertEvent event) {
    AdOperate entry = new AdOperate();
    entry.setType(OperationType.CREATE);
    entry.setDatetime(new Date());
    entry.setEntityName(event.getEntity().getClass().getName());
    saveOperate(event.getSession(), entry);
    log.debug(entry);
    }[/code]


    event.getEntity().getClass().getName()
    添加判断处理;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置