Monday, January 30, 2012

Hibernate interceptors


I am trying to implement method described here , but can't make it work.



There are no errors during compilation, but the interceptor never fired.



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



The intercepter class:




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



Config:




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



What's wrong? Thank you

1 comment:

  1. Few observations from you code


    You are NOT overriding any of the methods in EmptyInterceptor. Check out this link with a sample interceptor example.
    EmptyInterceptor provides the default implementations of an entity life cycle events which you can intercept. You need to override the method of your interest.
    I am not sure if transactionManager needs any reference to the interceptor. Its purely a hibernate thing. You can do away with it. Interceptors are needed either with session or session factory (you are using session level interceptor).

    ReplyDelete