2012-04-26 2 views
3

У меня есть две базы данных A, BI имеют таблицу asample в базе данных A и bsample в базе данных B. Теперь я хочу перенести данные из таблицы bsample базы данных B в таблицу asample базы данных. Для этого я должен использовать две единицы персистентности в файле persistence.xml. Я использую JPA, Spring. Я новичок в jpa. Может ли кто-нибудь сказать мне, как я могу это достичь.Конфигурирование нескольких единиц сохранения в JPA в одном файле XML

Если я использую ниже упомянутый код я получаю это исключение:

ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in ServletContext resource [/WEB-INF/classes/META-INF/spring-context/dao-DB1.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mediationEntityManagerFactory' defined in ServletContext resource [/WEB-INF/classes/META-INF/spring-context/dao-DB2.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: DB2] Unable to build EntityManagerFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:710) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:410) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5015) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5302) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mediationEntityManagerFactory' defined in ServletContext resource [/WEB-INF/classes/META-INF/spring-context/dao-DB2.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: DB2] Unable to build EntityManagerFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:398) 
    at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:275) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:79) 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70) 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:99) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1439) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1408) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    ... 26 more 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: DB2] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900) 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 
    ... 41 more 

Iplaced две инерционности единицы в моем файле persistence.xml и у меня есть два дао файлов как дао-DB1.xml, dao- DB2.xml там я настраиваю EntityManager, как указано в ответе.

ответ

3

Пример persistence.xml с двумя источниками данных, в этом случае обе базы данных Oracle, с использованием Hibernate в качестве поставщика JPA:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 
<persistence-unit name="DB1" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@server:port:sid"/> 
     <property name="javax.persistence.jdbc.user" value="username"/> 
     <property name="javax.persistence.jdbc.password" value="password"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
    </properties> 
</persistence-unit> 
<persistence-unit name="DB2" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <!-- same as above, different properties --> 
    </properties> 
</persistence-unit> 
</persistence> 

Если вы хотите, чтобы настроить единицы сохраняемости через весну, вы можете сделать:

<bean id="DB1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
    <property name="url" value="jdbc:oracle:thin:@server:port:sid"/> 
    <property name="username" value="username"/> 
    <property name="password" value="password"/> 
</bean> 

<bean id="DB2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <!-- same as above, different properties --> 
</bean> 

<bean id="DB1entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="DB1-unit"/> 
    <property name="dataSource" ref="DB1"/> 
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
     </props> 
    </property> 
</bean> 

<bean id="DB2entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="DB2-unit"/> 
    <property name="dataSource" ref="DB2"/> 
    <!-- same as above --> 
</bean> 
+2

я бы настоятельно рекомендую вам достаточно настроить JPA с помощью пружины, а не в инерционности XML, если вы желающие иметь упорство единиц. –

+0

Привет Большое спасибо за предоставление ответа. Я использую ваш код, но у меня есть сомнения, пока я читаю в google, поэтому многие используют JpaTemplate и TransactionManager. Но я не понял, что использовать эти теги. использовать их в моем xml-файле. Если вам нужно использовать, можете ли вы рассказать мне, как использовать их для моих двух баз данных. – rupa

+0

В коде показаны два альтернативных способа настройки двух источников данных и единиц измерения продолжительности. Первый выполняется исключительно в 'persistence.xml', другой - с помощью пружины. В DAO вы можете использовать аннотацию весны '@ PersistenceContext', чтобы внедрить диспетчер объектов, связанный с определенной единицей непрерывности. Затем вы можете выполнять запросы через этот менеджер сущностей. Если у вас есть другой вопрос, вы должны попытаться написать более четкий вопрос и быть более конкретным, чем «Может ли кто-нибудь сказать мне, как я могу это достичь». – beerbajay

5

Spring предлагает PersistenceUnitManager действовать как центральный репозиторий и избегать (потенциально дорогого) процесса обнаружения единиц сохранения. Реализация по умолчанию позволяет указать несколько местоположений.

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="persistenceXmlLocation"> 
    <list> 
    <value>org/springframework/orm/jpa/domain/persistence-multi.xml</value> 
    <value>classpath:/my/package/**/custom-persistence.xml</value> 
    <value>classpath*:META-INF/persistence.xml</value> 
    </list> 
    </property> 

</bean> 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitManager" ref="pum"/> 
</bean> 

Источник - Spring orm jpa

+1

Работал как шарм после переключения 'persistenceXmlLocation' с 'persistenceXmlLocations' – Vegard