Я работал над приложением, которое поддерживает множество баз данных (Oracle, Informix, SQL Server, MySQL). У нас есть один файл конфигурации и один набор сопоставлений. Мы используем jndi для подключения к базе данных, поэтому нам не приходится иметь дело с разными URL-адресами подключения в приложении. Когда мы инициализируем SessionFactory, у нас есть метод, который определяет тип базы данных из базового соединения. Например, вручную получите соединение через JNDI, а затем используйте connection.getMetaData (). GetDatabaseProductName (), чтобы узнать, что такое база данных. Вы также можете использовать переменную среды контейнера, чтобы явно установить ее. Затем установите диалект с помощью configuration.setProperty (Environment.DIALECT, deducedDialect) и инициализируйте SessionFactory как обычно.
Некоторые вещи, с которыми вам приходится иметь дело:
- Генерация первичного ключа. Мы используем настроенную версию стратегии TableGenerator, поэтому у нас есть одна таблица ключей со столбцами для имени таблицы и следующего ключа. Таким образом, каждая база данных может использовать одну и ту же стратегию, а не последовательность в Oracle, нативную для SQL Server и т. Д.
- Функции, специфичные для баз данных. Мы избегаем их, когда это возможно. Hibernate диалекты обрабатывают наиболее распространенные из них. Иногда нам приходится добавлять свои собственные в наши собственные классы диалекта, например. арифметика даты довольно нестандартна, поэтому мы просто составим имя функции и сопоставим его с подходом каждой базы данных.
- Генерация схемы - мы используем класс генерации схемы Hibernate - он работает с диалектами для создания правильного DDL для каждого типа базы данных и вынуждает базу данных соответствовать сопоставлениям. Вы должны знать ключевые слова для каждой базы данных, например, не пытайтесь использовать таблицу USER в Oracle (USERS будет работать) или таблицу TRANSLATION в MySQL.