休眠拦截器不起作用
Hibernate interceptor does not work
我正在尝试在我的 spring+hibernate 代码中使用拦截器。
inceptor定义如下:
public class myInterceptor extends EmptyInterceptor{
private static final long serialVersionUID = 1L;
Session session;
public void setSession(Session session) {
this.session=session;
}
public boolean onSave(Object entity,Serializable id,
Object[] state,String[] propertyNames,Type[] types)
throws CallbackException {
System.out.println("onSave");
return false;
}
public boolean onFlushDirty(Object entity,Serializable id,
Object[] currentState,Object[] previousState,
String[] propertyNames,Type[] types)
throws CallbackException {
System.out.println("onFlushDirty");
return false;
}
public void onDelete(Object entity, Serializable id,
Object[] state, String[] propertyNames,
Type[] types) {
System.out.println("onDelete");
}
//called before commit into database
public void preFlush(Iterator iterator) {
System.out.println("preFlush");
}
//called after committed into database
public void postFlush(Iterator iterator) {
System.out.println("postFlush");
}
}
以及我在 dao class 中的拦截器配置和用法以及 hibernate dao 支持扩展是
myInterceptor interceptor = new myInterceptor();
SessionFactory sessionFactory = getSessionFactory();
SessionBuilder sessionBuilder = sessionFactory.withOptions();
Session session = sessionBuilder.interceptor(interceptor).openSession();
interceptor.setSession(session);
Transaction tx = session.beginTransaction();
session.merge(member);
tx.commit();
session.close();
(我也做 SessionFactory 配置而不是这个)
第一个问题是我的拦截器的功能除了 preFlush 和 postFlush 之外不起作用!
第二个问题是我如何使用这个拦截器作为 SessionFactory 的一般配置,但只处理我的特定对象而不是所有对象。
您的拦截器方法 onSave、onFlushDirty 和 onDelete 没有在您的代码中调用,因为您没有添加、修改或删除实体。尝试创建、修改和删除托管实体,它会起作用。
您不能为特定实体配置拦截器;你将不得不在你各自的方法中编写 instanceofs 或 getClass().isAssignableFrom() 或类似的代码来限制那些行为。
我正在尝试在我的 spring+hibernate 代码中使用拦截器。
inceptor定义如下:
public class myInterceptor extends EmptyInterceptor{
private static final long serialVersionUID = 1L;
Session session;
public void setSession(Session session) {
this.session=session;
}
public boolean onSave(Object entity,Serializable id,
Object[] state,String[] propertyNames,Type[] types)
throws CallbackException {
System.out.println("onSave");
return false;
}
public boolean onFlushDirty(Object entity,Serializable id,
Object[] currentState,Object[] previousState,
String[] propertyNames,Type[] types)
throws CallbackException {
System.out.println("onFlushDirty");
return false;
}
public void onDelete(Object entity, Serializable id,
Object[] state, String[] propertyNames,
Type[] types) {
System.out.println("onDelete");
}
//called before commit into database
public void preFlush(Iterator iterator) {
System.out.println("preFlush");
}
//called after committed into database
public void postFlush(Iterator iterator) {
System.out.println("postFlush");
}
}
以及我在 dao class 中的拦截器配置和用法以及 hibernate dao 支持扩展是
myInterceptor interceptor = new myInterceptor();
SessionFactory sessionFactory = getSessionFactory();
SessionBuilder sessionBuilder = sessionFactory.withOptions();
Session session = sessionBuilder.interceptor(interceptor).openSession();
interceptor.setSession(session);
Transaction tx = session.beginTransaction();
session.merge(member);
tx.commit();
session.close();
(我也做 SessionFactory 配置而不是这个)
第一个问题是我的拦截器的功能除了 preFlush 和 postFlush 之外不起作用!
第二个问题是我如何使用这个拦截器作为 SessionFactory 的一般配置,但只处理我的特定对象而不是所有对象。
您的拦截器方法 onSave、onFlushDirty 和 onDelete 没有在您的代码中调用,因为您没有添加、修改或删除实体。尝试创建、修改和删除托管实体,它会起作用。
您不能为特定实体配置拦截器;你将不得不在你各自的方法中编写 instanceofs 或 getClass().isAssignableFrom() 或类似的代码来限制那些行为。