【问题标题】:creating transactionmanager and entity manager via configuration class通过配置类创建事务管理器和实体管理器
【发布时间】:2014-03-28 06:42:15
【问题描述】:

我对spring比较陌生,想用mysql实现spring jpa。下面提到的是我的配置...

<beans ...
<context:component-scan base-package="com.pg" />

<mvc:annotation-driven />

<tx:annotation-driven/>

<aop:aspectj-autoproxy />

<jpa:repositories base-package="com.pg.dao" /> ...

下面列出了我创建数据源、事务管理器和实体管理器的配置类。

package com.pg.conf;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import javax.transaction.TransactionManager;

import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

@Configuration
public class JPAConfiguration {

    @Bean
    public DataSource dataSource(){
        BasicDataSource datasource = new BasicDataSource();
        datasource.setDriverClassName(com.mysql.jdbc.Driver.class.getName());
        datasource.setUrl("jdbc:mydql://localhost:3306/pg1");
        datasource.setUsername("root");
        datasource.setPassword("root");
        return datasource;
    }

    @Bean
    public **FactoryBean<EntityManagerFactory>** entityManagerFactory(){
        LocalContainerEntityManagerFactoryBean containerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        containerEntityManagerFactoryBean.setDataSource(dataSource());
        HibernateJpaVendorAdapter adaptor = new HibernateJpaVendorAdapter();
        containerEntityManagerFactoryBean.setJpaVendorAdapter(adaptor);
        containerEntityManagerFactoryBean.setPackagesToScan("com.pg.entity");
        Properties props = new Properties();        
        props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        props.setProperty("hibernate.show_sql", "true");
        containerEntityManagerFactoryBean.setJpaProperties(props);
        return containerEntityManagerFactoryBean;
    }

    @Bean
    public TransactionManager transactionManager(){
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setDataSource(dataSource());
        **jpaTransactionManager.setEntityManagerFactory(entityManagerFactory());**
        return transactionManager();
    }

}

我有错误 jpaTransactionManager.setEntityManagerFactory(entityManagerFactory());

我认为 entitymanager 方法的返回类型不正确......即使它没有显示错误......

感谢任何帮助。

【问题讨论】:

    标签: java spring jpa spring-data-jpa


    【解决方案1】:

    从阅读 Spring 参考指南开始,阅读有关 FactoryBeans 的信息。

    然后相应地更改您的代码。

    @Bean
    public TransactionManager transactionManager(EntityManagerFactory entityManagerFactory){
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setDataSource(dataSource());
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
        return jpaTransactionManager;
    }
    

    【讨论】:

    • 其实FactoryBean + JavaConfig 有代理问题,完全不建议直接使用getObject(),尤其是在bean配置阶段。作为一个技巧:使用 FactoryBean 的结果作为 bean-method 参数,自动装配处理器会为你做这些事情。
    • 谢谢。这有帮助。我在 spring beans xml 文件中创建了事务管理器,目前一切正常。
    【解决方案2】:

    替换

    jpaTransactionManager.setEntityManagerFactory(entityManagerFactory());
    

    jpaTransactionManager.setEntityManagerFactory((EntityManagerFactory) entityManagerFactory());
    

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多