我正在编写一个休眠拦截器,我需要访问休眠会话对象。他们是使用拦截器访问休眠会话的直接方法吗?
我想要做的是找出hibernate连接到的数据库。由于各种原因,将其存储为线程本地数据是不切实际的。
是的,有一种方法......只需在创建后将会话传递给拦截器:
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();
}
似乎没有“官方”方式来获取会话对象,也o.h.Interceptor
没有通过o.h.EmptyInterceptor
. 此外,Interceptor
的 Javadoc 说:
SessionFactory 可能有一个 Interceptor 实例,或者可能为每个 Session 指定一个新实例。无论使用哪种方法,如果 Session 要可序列化,则拦截器必须是可序列化的。这意味着 SessionFactory 范围的拦截器应该实现 readResolve()。
Session 不能从回调中调用(回调也不能导致集合或代理被延迟初始化)。
获取此信息的唯一方法似乎是使用反射,并已在此处回答。