Hibernate или iBatis или что-то еще? - PullRequest
3 голосов
/ 17 ноября 2009

В моем проекте мне нужно переключаться между базами данных во время выполнения. Я пытался использовать Hibernate, но застрял в месте, где мне нужно сопоставить объект с таблицей в базе данных. Проблема в том, что у меня есть несколько таблиц с префиксом: Documents2001, Documents2002 ... Как я понял, я не могу сопоставить класс с таблицей во время выполнения. Я пытался использовать iBatis, но проблема в изменении базы данных во время выполнения. В iBatis это сделать довольно сложно. \

Может быть, несколько советов, что мне использовать?

Мои требования:

  • Возможность подключения к различным базам данных во время выполнения
  • Возможность изменять таблицу во время выполнения (если класс отображается на таблицу, как в Hibernate).

UPDATE: Хорошо, я попытаюсь объяснить:
Я должен написать приложение, которое может подключаться к различным базам данных во время выполнения. Пользователь приложения может выбрать, к какой базе данных подключаться. Все базы данных имеют одинаковую структуру. В дополнение к этому пользователь может переключаться между таблицами в базе данных. Таблицы с одинаковой структурой.

  • Почему я предположил, я не могу использовать Hibernate: в Hibernate класс отображается с таблицей, поэтому я не могу изменить таблицу во время выполнения. Это не позволяет мне выбирать таблицу, к которой я могу подключиться.
  • Почему я предположил, я не могу использовать iBATIS. В iBATIS очень сложно подключиться к другой базе данных во время выполнения. Таким образом, пользователь не сможет подключаться к другой базе данных во время выполнения.

Может быть, я могу использовать другой инструмент?

Ответы [ 3 ]

11 голосов
/ 17 ноября 2009

Работа с динамическими именами таблиц в Ibatis тривиальна. Просто используйте выражения вроде:

SELECT * FROM $tableName$

, где tableName - свойство класса параметров.

Работа с динамическими именами таблиц в Hibernate (или любом поставщике JPA) чрезвычайно сложна, если не непрактична (или даже невозможна). Этот вопрос возник раньше. См. JPA: Как указать имя таблицы, соответствующее классу во время выполнения? .

Работа с динамическими источниками данных в Ibatis потребует от вас написания некоторого кода, но не слишком много. По сути, Ibatis работает над концепцией sqlMapClient, которая имеет источник данных и список запросов, которые он может выполнять. Просто создайте один sqlMapClient для каждой базы данных, каждая с различным источником данных, и пусть они включают все одинаковые файлы запросов (в конфигурации карты sql).

DAO можно записать так, чтобы в него было вставлено несколько sqlMapClients, и он выбирает, какой из них использовать во время выполнения. Эту часть вы должны написать сами, но она проста.

Это основано на знании баз данных во время компиляции. Если база данных не известна до времени выполнения, тогда это немного сложнее. Это все еще возможно, но я не уверен, как Ibatis отреагирует, если вы в основном будете менять источники данных во время выполнения с sqlMapClient. Это может сработать, может взорваться. Вам придется попробовать и посмотреть.

Hibernate также может работать здесь по тому же принципу: вы вводите несколько единиц персистентности в DAO и используете правильные во время выполнения. С Hibernate (или любым JPA-провайдером) вам придется следить за тем, чтобы ваши управляемые объекты сохранялись в правильной единице персистентности. Я легко вижу, как это превращается в настоящий кошмар.

Один общий комментарий: не рекомендуется идти по пути динамических имен таблиц или баз данных, поэтому действительно задумайтесь над тем, что вы делаете и почему, и спросите себя, можно ли это исправить, сделав лучший выбор дизайна.

1 голос
/ 17 ноября 2009

Я не совсем понимаю ваше требование, но это возможно:

И Hibernate, и iBatis могут работать из DataSource, поэтому вы можете создать свою собственную реализацию javax.sql.DataSource, которая будет возвращать разные соединения при каждом вызове getConnection ().

Использование источника данных в Hibernate

1 голос
/ 17 ноября 2009

У таблиц одинаковая структура, только разные имена?

Это определенно возможно отобразить в iBATIS.

Вам просто нужно включить что-то подобное в свою карту SQL:

<select id="selectAll" resultMap="result" parameterClass="myParameterClass">
    SELECT ColumnA, ColumnB FROM $tableName$
</select>

Если я правильно понял ваш вопрос, это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...