当前位置: 首页 > 知识库问答 >
问题:

用Spring AOP配置Hibernate会话

段干帅
2023-03-14

我有一个Spring Framework4应用程序,它使用Hibernate4.3.8作为JPA提供程序。我想使用Hibernate过滤器,因此我需要启用它们。我想在应用程序中全局地做到这一点,我试图用Spring AOP做到这一点。这个想法是,我可以编写一个方面,在每次创建/获取会话时启用过滤器,就像这个问题和这个问题一样。

我已经将spring-aopAspectJweaver依赖项添加到我的项目中(使用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");
    }
}
@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();
    }
}

本质上,我的AOP设置适用于我自己的定制类。我想问题可能是编织没有用Hibernate或其他什么配置(我对这一部分都很不熟悉),或者由于我的设置,会话没有通过SessionFactory.getCurrentSession()方法获得。我试图通过将切入点更改为执行(*org.Hibernate.Hibernate.isinitialized(..))并在代码中手动调用Hibernate.isinitialized(null)来验证我的建议是否适用于Hibernate,但这也没有触发建议,所以这可能是问题所在。我尝试了这篇文章中的建议来启用冬眠编织,但我无法让它有任何不同。

我还试图将切入点设置为执行(*org.springframework.orm.hibernate4.sessionholder.getsession(..))执行(*org.springframework.orm.jpa.vendor.hibernatejpadicalt.getsession(..)),但也没有成功。

所以,我不确定下一步该去哪里。如何从建议中获取Hibernate的session对象,以便启用Hibernate筛选器?提前感谢!

编辑:以防万一,我的配置中确实存在@enableaspectJAutoProxy:

@Configuration
@ComponentScan(basePackages = { ... })
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {
    // ...
}

共有1个答案

上官彬
2023-03-14

也许是因为您使用org.hibernate.sessionFactory接口作为执行参数来声明切入点······

@pointcut(“execution(*org.hibernate.sessionfactory.getCurrentSession(..))”)

正确的方法是将切入点的执行定义为该接口的实现,其表示法略有不同,请参见+符号

您还应该看看aspectj-cheak-sheet

关于java.lang.IllegalArgumentException:不能子类final类。目标类是org.hibernate.sessionFactory的具体实现,即org.hibernate.internal.sessionFactoryImpl,它恰好是final,public final类sessionFactoryImpl

根据文档,proxytargetclass=true配置

如果最终类的名称出现在另一个类声明的extends子句(§8.1.4)中,则是编译时错误;这意味着final类不能有任何子类。

 类似资料:
  • 本文向大家介绍SpringAOP中的注解配置详解,包括了SpringAOP中的注解配置详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringAOP中的注解配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用注解实现SpringAOP的功能: 例子: xml配置:注意给例子中使用的其他的类上面也使用注解 注意:<aop

  • 我正在尝试在eclipse中设置Hibernate Tools。问题是它找不到任何映射文件。 我创建了一个控制台配置,指向我的environment.properties文件和hibernate.cfg.xml.问题是hibernate.cfg.xml.中没有映射 看起来它在myproject持久化中使用了spring bean sessionFactory。xml(如下)来查找所需的映射文件。我

  • Oracle正在转向通用连接池(UCP),用于维护可以借用、返回或关闭的池连接。我的webapplication在它自己的数据层中就有了这一点。这个应用程序将迁移到使用Hibernate的JPA。此时,我只能将Hibernate配置为使用Oracle JDBC驱动程序。

  • 问题内容: 我正在使用Spring和Hibernate,Spring的配置如下。如何配置两个数据源, session factories。使用注释管理事务。请指教 问题答案: 在Hibernate DAO中,我们可以使用@Qualifier注释,如下所示连接2个会话工厂

  • 问题内容: 我目前正在构建一个库以对我的一些代码进行模块化,并且我遇到了Hibernate的问题。 在我的主应用程序中,我有一个hibernate配置来获取运行所需的信息,但是我的库中也需要hibernate,因为我想要的某些对象可以在其他应用程序中使用。 当我启动两个hibernate设置的tomcat服务器时,出现错误,指出无法解析bean,并且说我的查询中缺少位置参数的bean。但是,当我仅