Ну, сейчас самое время сделать все правильно.
Невозможно добавить второе соединение и сохранить описанный вами шаблон.
Вместо этого вы можете попытаться сделать все правильно.
У вас есть два варианта.
Первый вариант . Держите беспорядок и сделайте его немного хуже (не сообщая своим клиентам)
- Создайте служебный класс, который будет обрабатывать соединения для вас. На этот раз не ограничивайтесь только двумя. Вместо этого используйте карту и не делайте ее статичной.
- Измените свой статический класс, используя этот новый служебный объект.
Создайте новую утилиту подключения (HibernateUtility2) и используйте этот новый объект утилиты.
// Create a new utility class using a map instead.
class HibernateUtility {
private Map<String, SessionFactory> factories;
private HibernateUtility instance;
public static HibernateUtility getInstance() {
if( instance == null ) {
instance = new HibernateUtility();
}
return instance;
}
private HibernateUtility() {}
private void check( String whichConnection ) {
if( !factories.containsKey( whichConnection ) ) {
// start the connection
factories.put( whichConnection, new Configu..
//... etc etc ().configure().buildSessionFactory() );
}
}
void openSession( String whichConnection ) {
check( whichConnection );
//open session with sessionFactory
factories.get( whichConnection ).open(); //etcetc
}
Session currentSession( whichConnection ) {
check( whichConnection );
//return the currently open session
factories.get( whichConnection ) .....
}
void closeSession( String whichConnection ) {
check( whichConnection );
//close the currently open session
factories.get( whichConnection );
}
}
//------------------------------------------
// Make your existing class call that class
public class HibernateUtil {
static void openSession() {
//open session with sessionFactory
HibernateUtility.getInstance( "one" ).openSession();
}
public static Session currentSession() {
//return the currently open session
HibernateUtility.getInstance( "one" ).currentSession();
}
static void closeSession() {
//close the currently open session
HibernateUtility.getInstance( "one" ).closeSession();
}
}
//------------------------------------------
// Make the new connection use that class too.
public class HibernateUtil {
static void openSession() {
//open session with sessionFactory
HibernateUtility.getInstance( "two" ).openSession();
}
public static Session currentSession() {
//return the currently open session
HibernateUtility.getInstance( "two" ).currentSession();
}
static void closeSession() {
//close the currently open session
HibernateUtility.getInstance( "two" ).closeSession();
}
}
Таким образом, существующий клиентский код не сломается.
Второй вариант . Очистите бардак и измените код соответствующим образом.
Во втором варианте вы создаете объект, очень похожий на HibernateUtility, описанный ранее, но на этот раз вы не добавляете методы openSession или closeSession , которые не принадлежат к этому интерфейсу.
Используя этот нестатический метод, вы сможете создавать разные экземпляры, которые могут подключаться к разным конфигурациям.
Вы просто используете currentSession , который, если сеанс не существует, создает новый и получает в качестве параметра идентификатор (очень похожий на «один» и «два» в предыдущем примере)
В этом втором варианте вы должны изменить свой клиентский код, чтобы использовать правильную реализацию.
Примечание: Что-то не так с форматированием кода в SO, мне потребовалось некоторое время, чтобы отформатировать его таким, какой он есть, и это не очень хорошо выглядит :(