здесь у меня есть проблема, которую я хочу найти здесь, я работаю над проектом, используя spring mvc и hibernate в моем проекте. У меня есть несколько баз данных с одинаковой архитектурой (база данных по компании) и база данных для аутентификации, когда пользователь входит в систему i должен создать SessionFactory, который соответствует базе данных компании-пользователя, не могли бы вы помочь мне, предложив мне архитектуру и приведя несколько примеров, пожалуйста, извините за мой английский.
spring mvc hibernate создание и управление сеансовыми фабриками нескольких баз данных
Ответы (1)
В зависимости от того, какую версию гибернации вы используете, вы можете просто использовать встроенные многопользовательские функции гибернации. Для этого вам необходимо реализовать CurrentaTenantIdentifierResolver
и MultiTenantConnectionProvider
в соответствии с этой документациейданная документация
следующие свойства hibernateProperties должны быть установлены дополнительно, чтобы использовать их:
hibernate.multiTenancy=DATABASE
hibernate.tenant_identifier_resolver=xxx.xxx.CurrentTenantIdentifierResolverImpl
hibernate.multi_tenant_connection_provider=xxx.xxx.MultiTenantConnectionProviderImpl
Пример реализации: CurrentTenantIdentifier:
import javax.faces.context.FacesContext;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
public class CurrentTenantIdentifierResolverImpl implements CurrentTenantIdentifierResolver {
@Override
public String resolveCurrentTenantIdentifier() {
if (SecurityContextHolder.getContext().getAuthentication().getPrincipal().yourOwnRoutineToDetermineCompanyxxx=="companyxxx"){
return "companyxxx";
} else if ... furhter companies{
...
}
}
@Override
public boolean validateExistingCurrentSessions() {
return true;
}
}
Мультитенантконнектионпровайдер:
public class MultiTenantConnectionProviderImpl extends AbstractMultiTenantConnectionProvider {
@Autowired
private DataSoruce DScompany02;
@Autowired
private DataSource DScompany01;
@Autowired
private DataSource default;
@Override
protected ConnectionProvider getAnyConnectionProvider() {
return new DatasourceConnectionProvider(default);
}
@Override
protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
if (tenantidentifer == "company01"){
return new DatasourceConnectionProvider(DScompany01);
} repeat....
}
}
теперь просто определите источник данных для каждой БД компании, чтобы он мог быть заменен мультитенантным провайдером подключения.
Вызов sessionFactory в DAO можно выполнить с помощью SessionFactory.getCurrentSession()
или, в особых случаях, с помощью sessionFactory.withOptions().tenantIdentifier("company01").openSession()
Это должно охватывать основы, но может потребоваться некоторая адаптация к вашему приложению.