java – Spring JPA多个持久化单元:注入EntityManager
我需要使用一个数据库进行查询(非修改),另一个用于命令(修改).我使用的是
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> Spring throws org.springframework.beans.factory.NoSuchBeanDefinitionException:未定义名为“persistence.reading”的bean.奇怪的是,看起来Spring试图用持久化单元名称来实例化一个bean?我错配了什么吗? 更新:当我从@PersistenceContext注释中删除unitName =“persistence.reading”时,我会得到以下错误: 更新2:Rohit建议(在注释中)连接EntityManagerFactory.所以我试图做以下: @PersistenceUnit(unitName = "persistence.reading") private EntityManagerFactory emf; 但是Spring只报告:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“persistence.reading”的bean FINAL FIX: @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不是
properly configured.你应该使用一个LocalContainerEntityManagerFactoryBean:
@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(); } JpaTransactionManager也是配置错误的.应该是这样的: @Bean(name = "readingTransactionManager") public PlatformTransactionManager readingTransactionManager(){ JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(readingEntityManagerFactory()); return transactionManager; } 您需要对阅读和写入EntityManager配置执行相同操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |