我正在编写一个hibernate拦截器,我需要访问hibernate会话对象。他们是使用拦截器访问hibernate会话的直接方法吗?
我要做的是找出hibernate连接的数据库。由于各种原因,将线程本地数据存储起来是不切实际的。
答案 0 :(得分:4)
是的,有一种方法......只需在创建后将会话传递给Interceptor:
Session session = factory.openSession(interceptor);
interceptor.setSession(session);
你有拦截器内的会话!请记住:
两个会话的交易相同
try {
Connection connection = mySession.connection();
Session tempSession = HibernateUtil.getSessionFactory().openSession(connection);
// do something
tempSession.flush();
}
finally {
tempSession.close();
}
答案 1 :(得分:0)
似乎没有通过o.h.Interceptor
通过o.h.EmptyInterceptor
获取会话对象的“官方”方式。此外,Interceptor
的Javadoc说:
SessionFactory可能只有一个Interceptor实例, 或者可以为每个会话指定一个新实例。任何 使用方法,如果Session,拦截器必须是可序列化的 是可序列化的。这意味着SessionFactory-scoped 拦截器应该实现readResolve()。
可能无法从回调调用会话(也可能无法回调 导致集合或代理被懒惰地初始化。)
获取此信息的唯一方法似乎是使用反射,并已回答here。