从Interceptor获取Hibernate Session

时间:2012-05-23 06:50:19

标签: java hibernate

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

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

2 个答案:

答案 0 :(得分:4)

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

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

你有拦截器内的会话!请记住:

  1. Interceptor无法访问其运行的会话,因此请勿直接使用它来更改/添加对象。
  2. 您可以在同一个JDBC连接上打开临时会话
  3. 两个会话的交易相同

    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