JPA Hibernate - несколько диалектов базы данных и тип данных nvarchar (длина)

0

Я должен сделать проект с использованием 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.

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

Теги:
sql-server
hibernate
jpa

1 ответ

0

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

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

  • 0
    Окей, большое спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню