Hibernateでは複数のスキーマが必要です。Hibernateで複数のスキーマを設定する方法
私たちのプロジェクトでは、ユーザー名とパスワードに基づいて複数のスキーマに接続する必要があります。しかし、Hibernateで複数のスキーマを設定するには?
方法がある場合は教えてください。
Hibernateでは複数のスキーマが必要です。Hibernateで複数のスキーマを設定する方法
私たちのプロジェクトでは、ユーザー名とパスワードに基づいて複数のスキーマに接続する必要があります。しかし、Hibernateで複数のスキーマを設定するには?
方法がある場合は教えてください。
感謝を行うことができます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
を使用して、ユーザー/パスワードの資格情報を非表示にします。
エンティティのテーブルを定義しながら、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へ
こんにちは、ありがとうございますが、同義語を使用しています。問題は解決しました。 –