우리는 최대 절전 모드에서 여러 스키마에 대한 요구 사항이 있습니다.최대 절전 모드로 여러 스키마를 구성하는 방법
우리 프로젝트에서는 사용자 이름과 암호를 기반으로 여러 스키마에 연결해야합니다. 그러나 Hibernate에서 여러 스키마를 구성하는 방법은 무엇입니까?
방법이 있으면 알려주십시오.
우리는 최대 절전 모드에서 여러 스키마에 대한 요구 사항이 있습니다.최대 절전 모드로 여러 스키마를 구성하는 방법
우리 프로젝트에서는 사용자 이름과 암호를 기반으로 여러 스키마에 연결해야합니다. 그러나 Hibernate에서 여러 스키마를 구성하는 방법은 무엇입니까?
방법이 있으면 알려주십시오.
감사합니다, 당신은 다음과 같이 그렇게 쉽게 할 수 있습니다 로 :
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를 참조 할 수 있지만, 특정 최대 절전 모드되지 않습니다. 당신은 단지 최대 절전 모드 Session
에 세입자 식별자를 제공 할 필요가 있으므로
각 스키마, 세입자 수 있으며, 최대 절전 모드가 연결을 어떤 데이터베이스 스키마 알 : Hibernate Multitenancy support에
안녕하세요, 감사합니다.하지만 동의어를 사용했습니다. 문제가 해결되었습니다. –