我只能找到与Interceptor
一起使用的sessionFactory.openSession
:
SessionFactory sessionFactory = ...;
Session session = sessionFactory.openSession(new MyInterceptor()); // it works! (MyInterceptor extends EmptyInterceptor)
是否可以使用Interceptor
以及sessionFactory.getCurrentSession
?
答案 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 {...}