【问题标题】:How do I hook up my Hibernate 4 interceptor in Java configuration for Spring 3?如何在 Spring 3 的 Java 配置中连接我的 Hibernate 4 拦截器?
【发布时间】:2014-03-15 03:03:13
【问题描述】:

我有一个 Hibernate 拦截器,我想对 Hibernate 进行 onLoad() 调用。我这样做是因为我希望 JPA 实体有一个由 Spring 注入的 SecureRandom 实例。由于 JPA 上下文和 Spring 上下文不混合,这是从 Spring 上下文到 JPA 上下文的桥梁。

我的 Java 配置中有“两个地方”,我在其中设置 Hibernate 4 的东西。我在下面包含了他们的输入。根据这个(https://jira.springsource.org/browse/SPR-8940),我认为要以编程方式设置 Hibernate 拦截器,我需要访问 LocalSessionFactoryBean。也许通过 LocalContainerEntityManagerFactoryBean?我只是不知道该怎么做,或者我是否需要重新配置我设置 Hibernate 东西的方式。任何帮助将不胜感激!

@Bean
JpaTransactionManager jpaTransactionManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(localContainerEntityManagerFactoryBean.getObject());
    return jpaTransactionManager;
}

@Bean(name = "LocalContainerEntityManagerFactory")
@Autowired
public LocalContainerEntityManagerFactoryBean entityManagerFactory(BasicDataSource jdbcConnection) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    localContainerEntityManagerFactoryBean.setDataSource(jdbcConnection);
    localContainerEntityManagerFactoryBean.setPackagesToScan(this.getClass().getPackage().getName());

    Properties jpaProperties = new Properties();
    jpaProperties.setProperty("hibernate.hbm2ddl.auto", "create");
    localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
    hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
    hibernateJpaVendorAdapter.setShowSql(true);
    localContainerEntityManagerFactoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter);
    return localContainerEntityManagerFactoryBean;
}


@Component
public class InvitationEntityInterceptor extends EmptyInterceptor {
    @Autowired
    SecureRandom secureRandom;
    @Override
    public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        if(entity instanceof Invitation) {
            Invitation invitation = (Invitation) entity;
            invitation.setRandom(secureRandom);
        }
        return false;
    }
}

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    我就是这样处理的:

    Spring数据库配置类:

    @Bean
    @DependsOn("hibernateInterceptor")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            DataSource dataSource,
            JpaVendorAdapter jpaVendorAdapter,
            HibernateInterceptor hibernateInterceptor) {
    
        LocalContainerEntityManagerFactoryBean emfb =
                new LocalContainerEntityManagerFactoryBean();
        ...
        Properties props = new Properties();
        props.put("hibernate.ejb.interceptor", hibernateInterceptor);
        emfb.setJpaProperties(props);
        return emfb;
    }
    

    Hibernate 拦截器类:

    @Component
    public class HibernateInterceptor extends EmptyInterceptor {
        ...
        @Autowired
        private MyRepository myRepository;
        ...
    }
    

    【讨论】:

      【解决方案2】:

      我放弃了使用一些基于特定事件的休眠解决方案的方法,转而使用 @Configuration ,这需要 Spring 中的 aspectJ。

      http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/aop.html

      9.8.1 使用 AspectJ 通过 Spring 依赖注入域对象

      Spring 容器实例化和配置你定义的 bean 应用上下文。也可以请豆厂 根据 bean 定义的名称配置预先存在的对象 包含要应用的配置。 spring-aspects.jar 包含一个注释驱动的方面,该方面利用此功能来 允许任何对象的依赖注入。该支持旨在 用于在任何容器控制之外创建的对象。 领域对象通常属于这一类,因为它们通常是 使用 new 运算符以编程方式创建,或由 ORM 工具创建 数据库查询的结果。

      @Configurable 注解将一个类标记为符合条件 弹簧驱动的配置。在最简单的情况下,它可以只使用 作为标记注释:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多