1

우리는 최대 절전 모드에서 여러 스키마에 대한 요구 사항이 있습니다.최대 절전 모드로 여러 스키마를 구성하는 방법

우리 프로젝트에서는 사용자 이름과 암호를 기반으로 여러 스키마에 연결해야합니다. 그러나 Hibernate에서 여러 스키마를 구성하는 방법은 무엇입니까?

방법이 있으면 알려주십시오.

답변

1

감사합니다, 당신은 다음과 같이 그렇게 쉽게 할 수 있습니다 로 :

private void doInSession(String tenant, Consumer<Session> function) { 
    Session session = null; 
    Transaction txn = null; 
    try { 
     session = sessionFactory 
      .withOptions() 
      .tenantIdentifier(tenant) 
      .openSession(); 
     txn = session.getTransaction(); 
     txn.begin(); 
     function.accept(session); 
     txn.commit(); 
    } catch (Throwable e) { 
     if (txn != null) txn.rollback(); 
     throw e; 
    } finally { 
     if (session != null) { 
      session.close(); 
     } 
    } 
} 

당신은뿐만 아니라 MultiTenantConnectionProvider 구현을 제공해야합니다

public class ConfigurableMultiTenantConnectionProvider 
     extends AbstractMultiTenantConnectionProvider { 

    private final Map<String, ConnectionProvider> connectionProviderMap = 
     new HashMap<>(); 

    public ConfigurableMultiTenantConnectionProvider(
      Map<String, ConnectionProvider> connectionProviderMap) { 
     this.connectionProviderMap.putAll(connectionProviderMap); 
    } 

    @Override 
    protected ConnectionProvider getAnyConnectionProvider() { 
     return connectionProviderMap.values().iterator().next(); 
    } 

    @Override 
    protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { 
     return connectionProviderMap.get(tenantIdentifier); 
    } 
} 

그리고 다음과 같이 초기화 할 수 있습니다 :이 예는 H2를 사용

private void init() { 
    registerConnectionProvider(FRONT_END_TENANT); 
    registerConnectionProvider(BACK_END_TENANT); 

    Map<String, Object> settings = new HashMap<>(); 

    settings.put(AvailableSettings.MULTI_TENANT, multiTenancyStrategy()); 
    settings.put(AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, 
     new ConfigurableMultiTenantConnectionProvider(connectionProviderMap)); 

    sessionFactory = sessionFactory(settings); 
} 

protected void registerConnectionProvider(String tenantIdentifier) { 
    Properties properties = properties(); 
    properties.put(Environment.URL, 
     tenantUrl(properties.getProperty(Environment.URL), tenantIdentifier)); 

    DriverManagerConnectionProviderImpl connectionProvider = 
     new DriverManagerConnectionProviderImpl(); 
    connectionProvider.configure(properties); 
    connectionProviderMap.put(tenantIdentifier, connectionProvider); 
} 

때문에, tenantUrl는 다음과 같이 정의된다 :

이제
public static final String SCHEMA_TOKEN = ";INIT=CREATE SCHEMA IF NOT EXISTS %1$s\\;SET SCHEMA %1$s"; 

@Override 
protected String tenantUrl(String originalUrl, String tenantIdentifier) { 
    return originalUrl + String.format(SCHEMA_TOKEN, tenantIdentifier); 
} 

그냥 같은 SessionFactory에서 별도의 세입자와 스키마를 사용할 수 있습니다 :

doInSession(FRONT_END_TENANT, session -> { 
    Person person = new Person(); 
    person.setId(1L); 
    person.setName("John Doe"); 
    session.persist(person); 
}); 

doInSession(BACK_END_TENANT, session -> { 
    Person person = new Person(); 
    person.setId(1L); 
    person.setName("John Doe"); 
    session.persist(person); 
}); 

다른 ConnectionProvider 같은 MultiTenantConnectionProvider 행위 때문에, 당신은 각 tenan을 구성 할 수 있습니다 사용자/암호 자격 증명을 숨기는 별도의 DataSource을 사용하십시오.

+0

안녕하세요, 감사합니다.하지만 동의어를 사용했습니다. 문제가 해결되었습니다. –

2

엔티티의 테이블을 정의하는 동안 schema 요소로 지정할 수 있습니다. 그 구조가 유사하다으로

@Table (= "TABLE_NAME", 스키마 = "SCHEMA_NAME"이름)

그렇지

, 당신은 다음 같은 개체를 사용하는 각각의 스키마 &에 별도의 EntityManager 포인팅을 사용할 수 있습니다 .


편집 : 그런 다음 아래에 몇 가지 의사 코드는, 그것에서 SessionFactory을 구축 각 스키마 &에 대해 별도의 설정 파일을 가질 수 있습니다.

SessionFactory sf_1 = new Configuration().configure("schema1config.cfg.xml").buildSessionFactory(); 
SessionFactory sf_2 = new Configuration().configure("schema2config.cfg.xml").buildSessionFactory(); 

session_1 = sf_1.openSession(); //-- Similarly for other 

여러 스키마를 매핑 자세한 내용은 this link를 참조 할 수 있지만, 특정 최대 절전 모드되지 않습니다. 당신은 단지 최대 절전 모드 Session에 세입자 식별자를 제공 할 필요가 있으므로

각 스키마, 세입자 수 있으며, 최대 절전 모드가 연결을 어떤 데이터베이스 스키마 알 : Hibernate Multitenancy support

관련 문제