복붙노트

[SPRING] Spring + Hibernate + JPA + 다중 데이터베이스

SPRING

Spring + Hibernate + JPA + 다중 데이터베이스

나는 Spring + Hibernate + JPA 애플리케이션을 가지고있다. 사용자는 로그인 할 때 연결할 DB 목록에서 선택할 수 있습니다 (요구 사항). 모든 DB의 스키마는 동일하므로 동일한 엔티티와 DAO가 사용됩니다.

지금 당장 나는 하나의 EntityManager (DAO에 다음과 같이 주입 된 데이터베이스 하나를 가지고있다)가있다 :

@PersistenceContext
private EntityManager entityManager;

DAO가 서비스 계층으로부터받은 매개 변수 / 속성을 기반으로 자동으로 (Spring에 의해 관리되는) entityManager를 자동으로 수신하게하는 방법이 있습니까? (웹 레이어는 일종의 컨텍스트를 전송하고 선택된 데이터베이스의 이름 / 코드 / ID가 거기에있을 것입니다.)

아니면 내가 직접 관리해야합니까 (모든 entityManager를 만들어지도에 넣고 각 호출에 사용할 DAO 중 하나를 DAO에 알리는 것)?

나는 이것을 묻기 전에 약간의 연구를했지만 결과는 결론이 나지 않았다. 모델을 다루는 질문의 대부분은 2 개 이상의 DB와 여러 DB에 걸친 트랜잭션으로 퍼져 나갔다. 그러나 이것은 나에게 해당되지 않는다.

필자의 경우 일단 사용자가 연결되면 하나의 엔티티 관리자 만있는 응용 프로그램에 연결 한 것과 같습니다. 하나는 선택한 데이터베이스의 엔티티 관리자입니다. DB의 중반 세션이나 다른 것들 사이에 전환이 없습니다.

고맙습니다.

해결법

  1. ==============================

    1.이 기능을 멀티 테넌시라고합니다.

    이 기능을 멀티 테넌시라고합니다.

    Hibernate 4는 Spring에서 관리하는 EntityManager와 통합 될 수있을 지 확신 할 수 없지만이를 지원해야한다.

    또는 ConnectionProvider 레벨 또는 DataSource 레벨에서 데이터베이스 연결 생성을 가로 채고 ThreadLocal 변수에 저장된 테넌트 식별자를 기반으로 적절한 데이터베이스를 선택하는 것이 가장 쉬운 방법입니다.

    참조 :

  2. ==============================

    2.Spring에서는 다음과 같이 Annotation 구성 (AnnotationWebConfiguration)을 사용하여 EntityManagerFactory를 동적으로 빌드 할 수 있습니다.

    Spring에서는 다음과 같이 Annotation 구성 (AnnotationWebConfiguration)을 사용하여 EntityManagerFactory를 동적으로 빌드 할 수 있습니다.

    @Configuration
    public class MyAppConfig{
       public LocalContainerEntityManagerFactoryBean getEmf(){
           LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean ();
           Datasource ds = new .... ; // HERE!! you can create and configure your datasource to point to whatever you need
           emf.setName("system_pu");
           emf.setDatasource(ds);
           emf.setPackagesToScan(""); //optional if no persistence.xml is defined
           return emf;
       }
    }
    
  3. from https://stackoverflow.com/questions/8703242/spring-hibernate-jpa-multiple-databases by cc-by-sa and MIT license