2012-03-27 4 views
1

프로젝트에서 2 개의 데이터베이스가있는 스프링 데이터 JPA를 사용하려고합니다. 나는 '스프링 데이터가있는 여러 데이터베이스 JPA

@Repository 
public interface DeviceRepository extends JpaRepository<Device, DevicePK>, 
    JpaSpecificationExecutor<Device> { 
} 

: 여기

07:21:47.734 [main] ERROR o.s.web.context.ContextLoader - Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deviceRepository': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:342) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) ~[spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) ~[spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) ~[spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
... 

내 applicationContext.xml이다

다음
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource1"> 
    <property name="driverClassName" value="${database.driverClassName}"/> 
    <property name="url" value="${database.url1}"/> 
    <property name="username" value="${database.username1}"/> 
    <property name="password" value="${database.password1}"/> 
    <property name="testOnBorrow" value="true"/> 
    <property name="testOnReturn" value="true"/> 
    <property name="testWhileIdle" value="true"/> 
    <property name="timeBetweenEvictionRunsMillis" value="1800000"/> 
    <property name="numTestsPerEvictionRun" value="3"/> 
    <property name="minEvictableIdleTimeMillis" value="1800000"/> 
    <property name="validationQuery" value="SELECT 1"/> 
</bean> 
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager1"> 
    <property name="entityManagerFactory" ref="entityManagerFactory1"/> 
</bean> 
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager1"/> 
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory1"> 
    <property name="persistenceUnitName" value="persistenceUnit1"/> 
    <property name="dataSource" ref="dataSource1"/> 
</bean> 

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource2"> 
    <property name="driverClassName" value="${database.driverClassName}"/> 
    <property name="url" value="${database.url2}"/> 
    <property name="username" value="${database.username2}"/> 
    <property name="password" value="${database.password2}"/> 
    <property name="testOnBorrow" value="true"/> 
    <property name="testOnReturn" value="true"/> 
    <property name="testWhileIdle" value="true"/> 
    <property name="timeBetweenEvictionRunsMillis" value="1800000"/> 
    <property name="numTestsPerEvictionRun" value="3"/> 
    <property name="minEvictableIdleTimeMillis" value="1800000"/> 
    <property name="validationQuery" value="SELECT 1"/> 
</bean> 
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager2"> 
    <property name="entityManagerFactory" ref="entityManagerFactory2"/> 
</bean> 
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager2"/> 
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory2"> 
    <property name="persistenceUnitName" value="persistenceUnit2"/> 
    <property name="dataSource" ref="dataSource2"/> 
</bean> 

내 DAO 인터페이스입니다 : 그러나 예외가 나는 응용 프로그램을 실행하기 위해 노력하고있어 때 트리거됩니다 @PersistenceContext에 대해 많이 읽었지 만 JpaRepository에서는 사용법을 보지 못했습니다.

답변

1

그럼 당신은 2 개의 엔티티 관리자가 있습니다. JPARepository는 한번도 사용 해본 적이 없지만, nosql 용 스프링 데이터의 카운터 부분에 가깝게 작동하면 Spring은 클래스를 향상시키고 아마 EM을 삽입 할 것입니다. 문제는 당신이 2 EM을 선언했다는 것입니다. 당신은 만들 필요가

:

은 스프링 JPA 문서를 보라, 그들은 어떻게

0

길고도 짧은 이야기 당신의 repos에 특정 EMF를 추가하는 방법에 대한 저장소를 구성하는 방법을 보여 드리겠습니다 사용자 정의 해당 인터페이스의 구현과 그 구현은 엔티티 관리자 선언 포함하는 등 :

@PersistenceContext(unitName = "persistenceUnit1") 
    private EntityManager entityManager; 

당신이 퍼시스턴스 유닛을 사용하려면 1.

이것을 확인해보십시오 : http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations, 예제도 있고 예제 1.17 (페이지 아래쪽에 약간 있음) 인터페이스를 구현하고 엔티티 관리자가 있으며 엔티티 관리자가 슈퍼 생성자로 전달됩니다.

또한 Spring Data - JPA, customizing Repository not working을 살펴보고 JpaRepository를 확장하는 인터페이스 구현이 있으며 구현시 선언 된 엔티티 관리자도 있습니다. @PersistenceContext 주석에 unitName을 추가하고 그런 식으로 시도하십시오.

사용자 정의 메서드가 필요하지 않으므로 (인터페이스가 비어있을 수 있음) 엔티티 관리자를 전달하는 생성자가 필요하며 기본 자동 배선 동작을 우회하기 위해 고유 한 인터페이스를 확장하여 모든 작업을 수행해야합니다.

관련 문제