1

Hibernateでは複数のスキーマが必要です。Hibernateで複数のスキーマを設定する方法

私たちのプロジェクトでは、ユーザー名とパスワードに基づいて複数のスキーマに接続する必要があります。しかし、Hibernateで複数のスキーマを設定するには?

方法がある場合は教えてください。

答えて

1

感謝を行うことができますTo:

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を参照することができますが、それは具体的な冬眠されていません。

をあなただけにHibernate Sessionにテナント識別子を提供する必要があるように、各スキーマは、テナントとすることができ、Hibernateが接続するためにどのようなデータベーススキーマを知っている:あなたは、次のようにすることを簡単にHibernate Multitenancy support

関連する問題