Hibernate,如何使用拦截器和getCurrentSession()?

时间:2015-11-08 01:31:07

标签: hibernate

我只能找到与Interceptor一起使用的sessionFactory.openSession

SessionFactory sessionFactory = ...;
Session session = sessionFactory.openSession(new MyInterceptor()); // it works! (MyInterceptor extends EmptyInterceptor)

是否可以使用Interceptor以及sessionFactory.getCurrentSession

5 个答案:

答案 0 :(得分:3)

您需要将其添加到Configuration对象,例如

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {

        URL r1 = HibernateUtil.class.getResource("/hibernate.cfg.xml");
        Configuration c = new Configuration().configure(r1);
        c.setInterceptor(new AlmadrabaInterceptor());
        ...

另请参阅docs

  

会话打开时指定了会话范围的拦截器。

Session session = sf.withOptions( new AuditInterceptor()).openSession(); 
  

注册了SessionFactory范围的拦截器   在构建SessionFactory之前使用Configuration对象。   除非明确指定拦截器打开会话   使用时,提供的拦截器将应用于所有打开的会话   从那个SessionFactory。 SessionFactory范围的拦截器必须是   线程安全。确保您不存储特定于会话的状态,   因为多个会话可能会使用此拦截器   同时进行。

new Configuration().setInterceptor( new AuditInterceptor() );

希望它有所帮助。

答案 1 :(得分:2)

在最新的hibernate 5中,只有

try (Session session = sessionFactory.withOptions().interceptor(interceptor)
.openSession()){
//the code
}

类似这样的作品。

答案 2 :(得分:1)

Session session = sf.withOptions( new AuditInterceptor()).openSession(); 

这会引发编译时异常,withoptions不适用于参数。会话范围拦截器如上所示

Session session = sessionFactory.openSession(new MyInterceptor());  

也会抛出编译时异常。因为重载的opensession方法在Hibernate 3中可用,但在休眠4中不可用。

在会话级别使用以下语法:

Session session = factory.openSession();
session.sessionWithOptions().interceptor(new CustomInterceptor());

答案 3 :(得分:0)

如果我们想要使用拦截器和sessionFactory.getCurrentSession,我们可以设置一个SessionFactory范围的拦截器:

sessionFactory.setEntityInterceptor(new MyInterceptor());

然后每个会话都可以使用这个拦截器。

答案 4 :(得分:-1)

如果您正在使用带有Hibernate的Spring托管事务,并希望使用类似sessionFactory.getCurrentSession()的会话范围的拦截器,那么本文(https://leakfromjavaheap.blogspot.com/2013/07/contextual-session-local-hibernate.html)会提供更多详细信息。请注意,此处的其他答案使用了sessionfactory范围的拦截器,因此如果您正在寻找它,请参考这些。

下面是一些使用spring托管事务的示例代码。

服务层代码:

@Transactional()
public List<Language> getLanguageList() {
    return lookupDao.getLanguageList();
  // the auditInterceptor will be called before the transaction completes..
}

DAO图层代码:

public List<Language> getLanguageList() {
    List<Language> resultList = sessionFactory.getCurrentSession()
            .createQuery(..)
            .getResultList();

    return resultList;
}

spring事务配置如下所示:

@Configuration
public class Configuration {
    ...
    @Bean
    public HibernateTransactionManager transactionManager() throws IOException, NamingException {
        HibernateTransactionManager txManager = new HibernateTransactionManager(sessionFactory());
        txManager.setEntityInterceptorBeanName("auditInterceptor"); // that's the trick
        return txManager; 
    }
}

    @Component
    @Scope("prototype") // and that's the trick
    public class AuditInterceptor extends EmptyInterceptor {...}