如何在Hibernate中覆盖Session.save()?

时间:2019-06-20 11:24:46

标签: java hibernate inheritance hibernate3

我想在所有session.save()上注入如下所示。

public class MyHbnSession implements Session {

       @Override
       public Serializable save(Object obj) throws HibernateException {
           if(obj instanceof MyClass) {
               MyClass mc = (MyClass) obj;
               mc.setVal("Injected Prop");
           }
           return super.save(obj);
       }
}

然后每当我getSession我都应该收到我的自定义会话对象

MyHbnSession session = HibernateUtil.getSessionFactory().openSession();

我找不到休眠状态的方法。我想念的两件事

  • org.hibernate.Session是一个接口,而org.hibernate.impl.SessionImpl是实际的实现。但是在this case中实现了会话
  • 如何告诉休眠状态,这是我们的自定义会话实现,并且应由会话工厂使用

请让我了解我所缺少的东西。感谢您的帮助。

PS:我可以使用Aspectj做到这一点,但是由于许多原因,我不想这么做。

2 个答案:

答案 0 :(得分:2)

我个人不会覆盖会话,而是使用JPA批注@PreUpdate和@PrePersist。

这样,您可以直接修改所需的对象,如果需要多个类,则可以直接修改包含“ val”的抽象类。

这样,您将不必使用“ instanceof”并使实体的代码更具可读性。

答案 1 :(得分:0)

借助@pdem答案提示和this post,我得以解决该问题。这是我所做的要点。

拦截器实现

import java.io.Serializable;

import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;

public class MyHbnInterceptor extends EmptyInterceptor {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        if(entity instanceof MyClass) {
            // TODO: Do your operations here
        }
        return super.onSave(entity, id, state, propertyNames, types);
    }
}

让我们了解有关拦截器的休眠状态可以通过两种方式完成

  • 会话范围-仅适用于创建的会话
Session session = sf.openSession( new MyHbnInterceptor() );
  • 会话工厂范围-适用于会话工厂创建的所有会话
new Configuration().setInterceptor( new MyHbnInterceptor() );

this link中了解更多信息。

干杯!