4

我正在编写一个休眠拦截器,我需要访问休眠会话对象。他们是使用拦截器访问休眠会话的直接方法吗?

我想要做的是找出hibernate连接到的数据库。由于各种原因,将其存储为线程本地数据是不切实际的。

4

2 回答 2

4

是的,有一种方法......只需在创建后将会话传递给拦截器:

Session session = factory.openSession(interceptor);
interceptor.setSession(session);

你在拦截器中有会话!请记住:

  1. 拦截器无法访问它正在运行的会话,因此不要直接使用它来更改/添加对象。
  2. 您可以在同一个 JDBC 连接上打开临时会话
  3. 两个会话的事务将相同

    try {    
        Connection connection = mySession.connection();
        Session tempSession = HibernateUtil.getSessionFactory().openSession(connection); 
        // do something
        tempSession.flush(); 
    } 
    finally { 
        tempSession.close(); 
    }
    
于 2012-08-29T11:22:53.457 回答
0

似乎没有“官方”方式来获取会话对象,也o.h.Interceptor没有通过o.h.EmptyInterceptor. 此外,Interceptor的 Javadoc 说:

SessionFactory 可能有一个 Interceptor 实例,或者可能为每个 Session 指定一个新实例。无论使用哪种方法,如果 Session 要可序列化,则拦截器必须是可序列化的。这意味着 SessionFactory 范围的拦截器应该实现 readResolve()。

Session 不能从回调中调用(回调也不能导致集合或代理被延迟初始化)。

获取此信息的唯一方法似乎是使用反射,并已在此处回答。

于 2012-05-24T21:56:22.077 回答