我需要使用一个数据库进行查询(非修改),而使用一个数据库进行命令(修改)。我正在使用Spring Data JPA,所以我有两个配置类:
@Configuration @EnableJpaRepositories(value = "com.company.read", entityManagerFactoryRef = "readingEntityManagerFactory", transactionManagerRef = "readingTransactionManager") @EnableTransactionManagement public class SpringDataJpaReadingConfiguration { @Bean(name = "readingEntityManagerFactory") public EntityManagerFactory readingEntityManagerFactory() { return Persistence.createEntityManagerFactory("persistence.reading"); } @Bean(name = "readingExceptionTranslator") public HibernateExceptionTranslator readingHibernateExceptionTranslator() { return new HibernateExceptionTranslator(); } @Bean(name = "readingTransactionManager") public JpaTransactionManager readingTransactionManager() { return new JpaTransactionManager(); } } @Configuration @EnableJpaRepositories(value = "com.company.write", entityManagerFactoryRef = "writingEntityManagerFactory", transactionManagerRef = "writingTransactionManager") @EnableTransactionManagement public class SpringDataJpaWritingConfiguration { @Bean(name = "writingEntityManagerFactory") public EntityManagerFactory writingEntityManagerFactory() { return Persistence.createEntityManagerFactory("persistence.writing"); } @Bean(name = "writingExceptionTranslator") public HibernateExceptionTranslator writingHibernateExceptionTranslator() { return new HibernateExceptionTranslator(); } @Bean(name = "writingTransactionManager") public JpaTransactionManager writingTransactionManager() { return new JpaTransactionManager(); } }
在我的存储库中,有时我需要决定与EntityManager一起使用,如下所示:
@Repository public class UserReadingRepository { @PersistenceContext(unitName = "persistence.reading") private EntityManager em; // some useful queries here }
我使用在我的定义持久性单元的名称 的persistence.xml :
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="persistence.reading" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <non-jta-data-source>ReadingDS</non-jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> <persistence-unit name="persistence.writing" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <non-jta-data-source>WritingDS</non-jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> </persistence>
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'persistence.reading'定义了弹簧抛出。奇怪的是,看起来Spring尝试使用持久性单元名称实例化 bean ?我配置错误了吗?
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'persistence.reading'
更新 :当我unitName = "persistence.reading"从@PersistenceContext批注中删除时,我将得到以下错误: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: readingEntityManagerFactory,writingEntityManagerFactory
unitName = "persistence.reading"
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: readingEntityManagerFactory,writingEntityManagerFactory
更新2 :Rohit建议(在评论中)连接EntityManagerFactory。因此,我尝试执行以下操作:
EntityManagerFactory
@PersistenceUnit(unitName = "persistence.reading") private EntityManagerFactory emf;
但Spring仅报告: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'persistence.reading' is defined
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'persistence.reading' is defined
最终修正 :感谢Vlad的回答,我能够更新代码以使用以下代码(只需确保还定义了dataSourcebean):
dataSource
@Bean(name = "readingEntityManagerFactory") public EntityManagerFactory readingEntityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setPersistenceUnitName("persistence.reading"); em.setDataSource(dataSource()); em.setPackagesToScan("com.company"); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.afterPropertiesSet(); return em.getObject(); }
的配置EntityManageFactory不正确。您应该LocalContainerEntityManagerFactoryBean改用:
EntityManageFactory
LocalContainerEntityManagerFactoryBean
同样,它JpaTransactionManager也是配置错误的。应该是这样的:
JpaTransactionManager
@Bean(name = "readingTransactionManager") public PlatformTransactionManager readingTransactionManager(){ JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(readingEntityManagerFactory()); return transactionManager; }
对于读取和写入EntityManager配置,您都需要执行相同的操作。