Получение моего веб-приложения, чтобы быть независимым от базы данных с Hibernate - PullRequest
3 голосов
/ 09 марта 2010

Итак, наивысшая криптография наступила на днях: поскольку мы используем Hibernate, можем ли мы заставить наше веб-приложение работать как на Oracle, так и на MySQL, взаимозаменяемо?

Я подумал, что это будет простой случай изменения hibernate.cfg.xml, чтобы вместо подробного описания параметров, специфичных для MySQL, он ссылался на источник данных JNDI, позволяя приложению собираться независимо от базы данных, которую мы собираемся развернуть , Тогда переход на другую базу данных будет просто означать изменение отдельной конфигурации источника данных в JBoss, Jetty, WebLogic и т. Д. Реально ли это?

Ну, я дошел до того, что настроил это в Jetty, но меня сейчас смущает ошибка о том, что hibernate.dialect не был установлен в hibernate.cfg.xml. Но если я установлю диалект там, то мое приложение все еще будет построено на MySQL или Oracle, что на самом деле не то, что я хочу.

Либо я пытаюсь сделать невозможное, либо я упустил нечто принципиально очевидное ... У кого-то еще была похожая проблема (и последующее решение / обходной путь)?

Ответы [ 3 ]

3 голосов
/ 09 марта 2010

Ах - нет. Диалект является только элементом конфигурации. Конечно, приложение должно быть ПЕРЕКОНФИГУРИРОВАНО для другой базы данных.

Он в основном определяет генератор SQL (т.е. как выглядит исходящий SQL) и не вызывает никаких изменений в вашем приложении. Аналогично строке подключения к базе данных.

Причина: даже SQL Server может иметь разные диалекты для разных версий.

0 голосов
/ 09 марта 2010

Вы все еще можете сделать это динамически. Перед инициализацией фабрики конфигурации / сеанса откройте прямое соединение с источником данных с помощью JNDI. Затем используйте connection.getMetaData().getDatabaseProductName() или другой вызов JDBC, чтобы узнать, какую базу данных использует соединение, и соответственно установите диалект, например, hibernateConfiguration.setProperty(Environment.DIALECT, deducedDialect)

У меня есть приложение, которое может работать в SQL Server, Oracle, MySQL, DB2 и Informix. Если вы можете контролировать модель данных и сохранять простоту, встроенных диалектов будет достаточно. Однако могут возникнуть ситуации, когда вам нужно расширить диалект (ы), чтобы воспользоваться преимуществами более сложных функций.

0 голосов
/ 09 марта 2010

В то время как вы можете (и действительно должны при развертывании в контейнере) настроить Hibernate на использование источника данных JNDI (и, таким образом, настроить имя класса драйвера, URL-адрес БД, имя пользователя и пароль БД нана уровне сервера приложений) база данных по-прежнему имеет особенности (типы столбцов, собственный синтаксис и специфические функции, такие как столбцы автоинкремента в MySQL, последовательность в Oracle и т. д.), которые Hibernate должен учитывать.И это как раз цель диалектов SQL .Поэтому, если вы хотите изменить базу данных (и если ваши сопоставления или аннотации переносимы, я думаю, что генерация идентификаторов здесь), вам, по крайней мере, нужно будет установить правильный диалект.

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