JPA Hibernate - несколько диалектов базы данных и тип данных nvarchar (длина) - PullRequest
0 голосов
/ 25 января 2019

Мне нужно сделать проект с использованием JPA + Hibernate, в котором я использую 3 диалекта: MySQL5InnoDBDialect, MSSQL2012Dialect и Oracle12cDialect.

Сейчас у меня есть спецификация, в которой говорится, что для некоторого столбца:

  • База данных Oracle, мне нужно использовать тип данных NVARCHAR2 (LENGTH)

  • База данных MySql, мне нужно использовать тип данных VARCHAR (LENGTH)

  • База данных MSSQL, мне нужно использовать тип данных NVARCHAR (LENGTH)

... и вот моя проблема ..

  1. Если я использую:

    @ Column (name = "columnName" length = 255) private String columnName; hibernate генерирует varchar (255), и это хорошо только для MySQL

  2. Если я использую:

    @ Column (name = "columnName", columnDefinition = "nvarchar2 (255)") private String columnName; в MySQL это невозможно, я получаю сообщение об ошибке из-за columnDefinition, но в oracle все в порядке

  3. Я пытался настроить создание диалекта MySQL

    открытый класс CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect {

    public CustomMySQL5InnoDBDialect() {
        super();
        registerColumnType(Types.NVARCHAR, "nvarchar2($l)");//$l not $1
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
    }
    

    }

и предоставление этого класса в конфигурации гибернации для диалекта MySQL. У меня та же проблема в MySQL, если я использую свойство columnDefinition.

Можете ли вы помочь с этой проблемой, пожалуйста?

1 Ответ

0 голосов
/ 25 января 2019

Решение состоит в том, чтобы использовать функцию, предоставляемую спецификацией API JPA, только для этой ситуации. Определите файл orm.xml для каждого хранилища данных, которое вам нужно поддерживать, и включите необходимый файл при использовании каждой базы данных. См. эту ссылку для получения подробной информации о формате файла. Таким образом, вам не нужно думать о взломе внутренних функций любого провайдера JPA, которого вы используете, и вы также сохраняете переносимость провайдера JPA, а также переносимость базы данных

Идея размещения специфической для схемы информации (статической) аннотации Java является странной, особенно в том случае, если требуется переносимость базы данных.

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