我有一个
Spring Framework 4应用程序,它使用Hibernate 4.3.8作为JPA提供程序.我想使用Hibernate过滤器,因此我需要启用它们.我想在应用程序中全局执行此操作,我正在尝试使用Spring AOP.我的想法是,我可以编写一个方面,每次创建/获取会话时启用过滤器,如
this和
this问题.
我已经将spring-aop和aspectjweaver依赖项添加到我的项目中(使用Maven).我添加了以下方面.
@Aspect
@Component
public class EnableHibernateFilters {
@Pointcut("execution(* org.hibernate.SessionFactory.getCurrentSession(..))")
protected void sessionBeingFetched() {
}
@AfterReturning(pointcut = "sessionBeingFetched()", returning = "object")
public void enableFilters(JoinPoint joinPoint, Object object) {
System.out.println("!!! Enabling filters !!!"); // Never printed
Session session = (Session) object;
session.enableFilter("myFilter");
}
}
我的问题是从不调用上面的建议(enableFilters);既没有打印文本,也没有启用我的过滤器.我已经通过将切入点更改为我自己的一个类来验证我的方面被检测到并且AOP在我的项目中有效.我也尝试将切入点更改为执行(* org.hibernate.SessionFactory.openSession(..)),但没有结果.
我怀疑这是由我如何设置Hibernate引起的,因为我没有显式配置SessionFactory;相反,我设置了一个EntityManagerFactory.这是我的配置.
@Configuration
@EnableTransactionManagement
public class PersistenceConfig {
@Bean
public DataSource dataSource() throws NamingException {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/postgres"); // JNDI lookup
}
@Bean
public EntityManagerFactory entityManagerFactory() throws SQLException, NamingException {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(false);
vendorAdapter.setDatabase(Database.POSTGRESQL);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan(...);
factory.setDataSource(this.dataSource());
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public JpaTransactionManager transactionManager() throws SQLException, NamingException {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(this.entityManagerFactory());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
基本上我不确定使用上述配置的切入点.我试图搞乱LocalContainerEntityManagerFactoryBean.setLoadTimeWeaver(),但我无法弄明白.我不知道我是否还需要配置它.
从本质上讲,我的AOP设置适用于我自己的自定义类.我想问题是编织没有配置Hibernate或其他东西(我对这一部分非常不熟悉)或者由于我的设置而没有通过SessionFactory.getCurrentSession()方法获得会话.我尝试通过将我的切入点更改为执行(* org.hibernate.Hibernate.isInitialized(…))并在我的代码中手动调用Hibernate.isInitialized(null)来验证我的建议甚至可以使用Hibernate,但是这并没有触发建议,所以这可能是问题所在.我尝试了this post to enable Hibernate weaving的建议,但我无法让它有所作为.
我还尝试将我的切入点设置为执行(* org.springframework.orm.hibernate4.SessionHolder.getSession(..))和执行(* org.springframework.orm.jpa.vendor.HibernateJpaDialect.getSession(..)),但也没有任何运气.
所以,我不知道下一步该去哪里.如何从我的建议中获取Hibernate的Session对象,以便我可以启用Hibernate过滤器?先感谢您!
编辑:
为了以防万一,我的配置中存在@EnableAspectJAutoProxy:
@Configuration
@ComponentScan(basePackages = { ... })
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {
// ...
}