Я должен сделать проект с использованием JPA + Hibernate, в котором я использую 3 диалекта: MySQL5InnoDBDialect, MSSQL2012Dialect и Oracle12cDialect.
Прямо сейчас у меня есть спецификация, которая говорит мне, что для некоторого столбца:
База данных Oracle, я должен использовать тип данных NVARCHAR2 (LENGTH)
База данных MySql, я должен использовать тип данных VARCHAR (LENGTH)
База данных MSSQL, я должен использовать тип данных NVARCHAR (LENGTH)
... и вот моя проблема..
Если я использую:
@Column (name = "columnName" length = 255) private String columnName; hibernate генерирует varchar (255), и это хорошо только для MySQL
Если я использую:
@Column (name = "columnName", columnDefinition = "nvarchar2 (255)") private String columnName; в MySQL это невозможно, я получаю сообщение об ошибке из-за columnDefinition, но в Oracle все в порядке
Я пытался настроить создание диалекта MySQL
открытый класс CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
public CustomMySQL5InnoDBDialect() {
super();
registerColumnType(Types.NVARCHAR, "nvarchar2($l)");//$l not $1
registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
}
}
и предоставление этого класса в конфигурации гибернации для диалекта MySQL. У меня та же проблема в MySQL, если я использую свойство columnDefinition.
Можете ли вы помочь с этой проблемой, пожалуйста?
Решение состоит в том, чтобы использовать функцию, которую предоставляет спецификация JPA API, именно для этой ситуации. Определите файл orm.xml
для каждого хранилища данных, которое вам необходимо поддерживать, и включите необходимый файл при использовании каждой базы данных. Смотрите эту ссылку для получения подробной информации о формате файла. Таким образом, вам не нужно думать о взломе внутренних функций любого провайдера JPA, которого вы используете, и вы также сохраняете переносимость провайдера JPA, а также переносимость базы данных.
Идея размещения специфичной для схемы информации (статических) аннотаций Java является странной, даже более того, когда требуется переносимость базы данных.