Работа с динамическими именами таблиц в Ibatis тривиальна. Просто используйте выражения вроде:
SELECT * FROM $tableName$
, где tableName
- свойство класса параметров.
Работа с динамическими именами таблиц в Hibernate (или любом поставщике JPA) чрезвычайно сложна, если не непрактична (или даже невозможна). Этот вопрос возник раньше. См. JPA: Как указать имя таблицы, соответствующее классу во время выполнения? .
Работа с динамическими источниками данных в Ibatis потребует от вас написания некоторого кода, но не слишком много. По сути, Ibatis работает над концепцией sqlMapClient
, которая имеет источник данных и список запросов, которые он может выполнять. Просто создайте один sqlMapClient
для каждой базы данных, каждая с различным источником данных, и пусть они включают все одинаковые файлы запросов (в конфигурации карты sql).
DAO можно записать так, чтобы в него было вставлено несколько sqlMapClients
, и он выбирает, какой из них использовать во время выполнения. Эту часть вы должны написать сами, но она проста.
Это основано на знании баз данных во время компиляции. Если база данных не известна до времени выполнения, тогда это немного сложнее. Это все еще возможно, но я не уверен, как Ibatis отреагирует, если вы в основном будете менять источники данных во время выполнения с sqlMapClient
. Это может сработать, может взорваться. Вам придется попробовать и посмотреть.
Hibernate также может работать здесь по тому же принципу: вы вводите несколько единиц персистентности в DAO и используете правильные во время выполнения. С Hibernate (или любым JPA-провайдером) вам придется следить за тем, чтобы ваши управляемые объекты сохранялись в правильной единице персистентности. Я легко вижу, как это превращается в настоящий кошмар.
Один общий комментарий: не рекомендуется идти по пути динамических имен таблиц или баз данных, поэтому действительно задумайтесь над тем, что вы делаете и почему, и спросите себя, можно ли это исправить, сделав лучший выбор дизайна.