`
hyj_dx
  • 浏览: 101972 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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">
   <map>
     <entry key="post-commit-insert"><bean class="com.easou.ad.listener.SaveOrUpdateListener" /></entry>
    <!--  <entry key="post-commit-update"><bean class="com.easou.ad.listener.SaveOrUpdateListener" /></entry>-->
     <entry key="post-commit-delete"><bean class="com.easou.ad.listener.SaveOrUpdateListener" /></entry>
   </map>
  </property>

 

 

 

结果会插入N条 AdOperate 的记录

分享到:
评论
1 楼 hyj_dx 2009-01-15  
还有 event.getOldState()[i] 怎么都是null

相关推荐

    Hibernate中文文档

    - **PostInsertEventListener**:对象插入后触发。 - **PreUpdateEventListener**:对象更新前触发。 - **PostUpdateEventListener**:对象更新后触发。 - **PreDeleteEventListener**:对象删除前触发。 - **...

    精通Hibernate源码.rar

    深入理解Hibernate的源码,对于提升开发效率、优化性能以及解决实际问题具有重大意义。本文将从多个角度探讨Hibernate源码中的核心概念和实现机制。 1. **持久化模型设计** Hibernate通过Java类和数据库表之间的...

    hibernate5.0.9源码

    通过深入学习和理解Hibernate 5.0.9的源码,开发者不仅可以提升对ORM框架的理解,还能更好地利用Hibernate解决实际问题,提升开发效率,降低维护成本。同时,这也有助于理解其他ORM框架或Java持久化技术,为日后的...

    hibernate中英文参考手册

    `save()`方法用于插入新对象,`update()`用于更新已存在的对象,`delete()`用于删除对象。 2. Query和Criteria API:允许以HQL(Hibernate查询语言)或 Criteria API 进行复杂的查询。HQL类似于SQL,但面向对象,而...

    hiberante4.2.3-part01

    8. **事件监听器**:Hibernate允许注册事件监听器,如`PreUpdateEventListener`和`PostInsertEventListener`,在特定的数据库操作前后执行自定义逻辑。 9. **映射文件与注解**:Hibernate支持XML映射文件和注解两种...

    hibernate3.0API源文件

    Hibernate3.0允许注册事件监听器,监听持久化对象的生命周期事件,如`PreLoadEventListener`、`PostInsertEventListener`等。 14. **类型转换**: Hibernate3.0提供了一套类型系统,允许自定义类型映射,比如日期...

    java-Hibernate帮助文档

    15. **事件监听器(Event Listeners)**:Hibernate允许注册事件监听器来监听对象的生命周期事件,如`PreLoadEventListener`, `PostInsertEventListener`等。 学习和掌握Hibernate,有助于Java开发者更高效地进行...

    《Hibernate3.2 参考手册》

    9. **对象事件**:Hibernate支持对象状态转换的监听,如持久化、脱管、加载、更新等事件,可以通过实现`PreLoadEventListener`、`PostInsertEventListener`等接口进行定制。 10. **查询语言(HQL)与Criteria API**...

    hibernate-3.2.rar

    12. **事件监听器**:Hibernate提供了一系列的事件接口,如`PreLoadEventListener`, `PostInsertEventListener`等,可以自定义实现这些接口来扩展功能,如数据验证、日志记录等。 13. **实体生命周期**:Hibernate ...

    Hibernate API文档.rar

    `PreLoadEventListener`, `PostInsertEventListener`等接口提供了实现自定义逻辑的途径。 9. **持久化代理**:Hibernate使用透明代理机制,当访问一个持久化对象时,如果该对象尚未加载,Hibernate会自动从数据库中...

Global site tag (gtag.js) - Google Analytics