我想像下面这样在所有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();
我找不到如何在休眠中做到这一点。我想念的两件大事
- org.hibernate.Session 是一个接口,org.hibernate.impl.SessionImpl 是实际的实现。但在这种情况下,会话已实现
- 如何告诉休眠这是我们的自定义会话实现,会话工厂应该使用它
请告诉我我错过了什么。感谢您的任何帮助。
PS :我可以用aspectj做到这一点,但由于很多原因不想这样做。
我个人不会覆盖会话,而是使用 JPA 注释@PreUpdate和@PrePersist。
这样,您可以直接修改所需的对象,如果许多类需要它,则可能修改包含"val"的抽象类。
这样,您就不必使用"实例"并使实体的代码更具可读性。
在@pdem答案提示和这篇文章的帮助下,我能够解决问题。这是我所做的事情的要点。
拦截器实现
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() );
在此链接中了解更多信息。
干杯!