Hibernate拦截器

问题描述:

我试图实现方法here,但不能使它工作。Hibernate拦截器

编译期间没有错误,但拦截器从未被解雇。

DAO:

public class GeneralInvoicesDAO { 
@Autowired 
private SessionFactory sessionFactory; 

@Autowired 
private Interceptor entityInterceptor; 

    @Transactional 
    public void update(GeneralInvoice object) { 
     Session session = SessionFactoryUtils.getSession(sessionFactory, entityInterceptor, null); 

     session.saveOrUpdate(object); 
    } 
} 

的截击类:

public class NewEntityInterceptor extends EmptyInterceptor implements Interceptor { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 2914362528125673753L; 

    @Override 
    public Boolean isTransient(Object n) { 
     Logger logger = Logger.getLogger(getClass().getName()); 

     try { 
      logger.warn("test"); 
      Boolean result = Boolean.FALSE; 

      BaseEntity entity = (BaseEntity) n; 
      if (entity.getId() <= 0L) { 
       entity.setId(null); 
       result = Boolean.TRUE; 
      } 
      logger.warn(result.toString()); 
      return result; 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      return super.isTransient(n); 
     } 
    } 
} 

配置:

<bean id="newEntityInterceptor" class="de.crm.interceptor.NewEntityInterceptor" /> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
     <property name="entityInterceptor" ref="newEntityInterceptor" /> 
    </bean> 

有什么不对? 谢谢

一些意见,从你的代码

  1. 您尚未覆盖所有的方法EmptyInterceptor。用示例拦截器示例检出this link

  2. EmptyInterceptor提供了您可以拦截的实体生命周期事件的默认实现。你需要重写你感兴趣的方法。

  3. 我不确定transactionManager是否需要对拦截器的引用。它纯粹是休眠的事情。你可以放弃它。拦截器需要会话或会话工厂(,您正在使用会话级别拦截器)。