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

How to Override Session.save() in Hibernate?

我想在所有 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);
       }
}

然后每当我获取会话时,我应该收到我的自定义会话对象

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

我找不到如何使用休眠来执行此操作。我想念的两件事

请告诉我一些我所缺少的东西。感谢您的帮助。

PS : 我可以用 aspectj 来做,但由于很多原因我不想这样做。

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

通过这种方式,您可以直接修改所需的对象,如果您需要许多 class 对象,则可能和抽象 class 包含 "val"。

这样您就不必使用 "instanceof " 并使实体的代码更具可读性。

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

让 hibernate 了解我们的拦截器 可以通过两种方式完成

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

this link 中了解更多信息。

干杯!