java hibernate Aop_java – 使用Spring AOP配置Hibernate会话

我有一个

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 {

// ...

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值