Ну, это подходящее время, чтобы сделать все правильно.
Невозможно добавить второе соединение и сохранить шаблон, который вы описали.
Вместо этого вы можете попытаться все исправить.
У вас есть два варианта.
Первый вариант. Держите беспорядок и сделайте его немного худшим (не сообщая вашим клиентам)
- Создайте класс утилиты, который обрабатывает соединения для вас. На этот раз не ограничиваются только двумя. Вместо этого используйте карту и не ставьте ее.
- Измените свой статический класс на использование нового объекта утилиты.
Создайте свою новую утилиту подключения (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, что если сеанс не существует, создает новый, и получить в качестве параметра идентификатор (так же, как «один» и «два» в предыдущем примере)
В этом втором варианте вам нужно изменить свой код клиента, чтобы использовать правильную реализацию.
Примечание: Somethings неправильно с форматирования кода в SO, мне потребовалось некоторое время, чтобы отформатировать его так, как она есть, и это не выглядит хорошо :(
Согласовано. Сделайте класс нестатическим и добавьте статический заводский метод для возврата нового экземпляра. –
Я думал о длинном ответе, но это в значительной степени подводит итог. – eljenso
Это не ответ, а комментарий. – OscarRyz