spring mvc hibernate создание и управление сеансовыми фабриками нескольких баз данных

здесь у меня есть проблема, которую я хочу найти здесь, я работаю над проектом, используя spring mvc и hibernate в моем проекте. У меня есть несколько баз данных с одинаковой архитектурой (база данных по компании) и база данных для аутентификации, когда пользователь входит в систему i должен создать SessionFactory, который соответствует базе данных компании-пользователя, не могли бы вы помочь мне, предложив мне архитектуру и приведя несколько примеров, пожалуйста, извините за мой английский.


person user820688    schedule 27.05.2013    source источник


Ответы (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()

Это должно охватывать основы, но может потребоваться некоторая адаптация к вашему приложению.

person Carsten    schedule 27.05.2013
comment
Привет, Карстен, спасибо за ответ, я использую spring 3.2.2-RELEASE с спящим режимом 4.2, например, пользователь из компанииxxx аутентифицирован, и теперь мне нужно создать фабрику сеансов au, которая подключается к URL-адресу localahost:3306/dbcompanyxxx, как сделайте это, в моем DAO я должен сделать что-то вроде public List‹Model› getModel(){SessionFactory sesseionFactory = SessionManager.getSessionFactory(user.getIdCompany(); .....} можете ли вы разработать свой ответ, пожалуйста - person user820688; 27.05.2013
comment
Немного уточнил ответ. - person Carsten; 27.05.2013
comment
хорошо, спасибо, когда я использую openSession, он работает, но у меня не будет проблем с чтением или записью в базах данных? - person user820688; 27.05.2013
comment
Нет, сеанс, который вы получаете, открывается с (для этого случая) соответствующим соединением с БД. В этом сеансе вы можете делать все, что можете, со стандартной реализацией гибернации. - person Carsten; 27.05.2013
comment
Спасибо за решение, я воспользуюсь этим :-) - person user820688; 27.05.2013