2009-12-22 5 views
9

Проблема заключается в следующем: мы используем hibernate с аннотациями в качестве O/R Mapper.Спецификация конкретной базы данных базы данных Hibernate

Некоторые @column аннотации выглядеть следующим образом:

@Column(columnDefinition = "longblob", name = "binaryData", nullable = true)

или

@Column(columnDefinition = "mediumtext", name = "remark", nullable = true)

с ColumnDefinition атрибутов является MySQL конкретных

на Postgres, например, значения ColumnDefinition должны betea "и" varchar (999999) "

и на оракуле, вероятно, что-то еще.

Проблемы возникают в настоящее время во время экспорта схемы, например. при создании операторов DDL.

Возможные обходные пути, о которых я могу думать, - - Взломать некоторый драйвер JDBC, который заменяет текст (например, longblob-> bytea) для операторов DDL. Это некрасиво, но будет работать как-то . Используйте вместо hmernate xml конфигурацию вместо аннотаций. Это, вероятно, будет работать, но я предпочитаю аннотации

Кто-нибудь знает какие-либо альтернативы? Обходные ограничения на спящий режим в порядке, например. если атрибут ColumnDefinition может содержать определенные значения диалектных как

@Column(columnDefinition = "mysql->mediumtext, postgres->varchar(999999)", name = "remark", nullable = true)

Благодарности Хольгер

+1

Знаете ли вы, что если вы найдете ответ полезным, вы можете проголосовать за него. Нажмите на стрелку ВВЕРХ слева от ответа. :-) – KLE

+0

Это обеспечивает решение, специфичное для UUID, это не красиво: https://stackoverflow.com/a/48918942/2102158 –

ответ

9

Почему вы не использовать базы данных агностик аннотаций, как:

  • @Lob (на byte[] или String собственности)
  • @Column(length=90000) (на String)

и посмотреть, какие столбцы будут созданы в базе данных. Скорее всего, они будут того типа, которым вы хотите.

+0

Здравствуйте, спасибо, что я не знал об этом, что похоже на работу. С уважением Holger – user1946784

+1

И как исправить это для 'columnDefinition =" json "', где я не могу решить, является ли это json на основе этого типа. Postgres понимает json fine, но в H2 создание столбца просто терпит неудачу. Я хочу, чтобы hibernate отображал имя столбца в строку в этом случае. – Tarion

4

Некоторые идеи:

  • Использование аннотаций в целом, но перегружать их от Xml в случае где они специфичны для вашей базы данных. Тогда у вас может быть один файл конфигурации, специфичный для вашей базы данных.
  • Используйте java Constants в своих аннотациях (они должны быть константами времени компиляции, поэтому вы ограничены). Вы можете иметь несколько наборов констант Java и указывать на тот, который вы хотите экспортировать. (Остерегайтесь, когда вы указываете на другую константу, вам нужно перекомпилировать все.)
  • У меня также я использовал диалект для переключения кода в моем классе конфигурации. Класс конфигурации получает все данные (из аннотаций или xml), а затем может обрабатывать их после обработки.

    Например, я изменил символ конкатенации из '||' от Oracle до «+» на SqlServer.
    Это удобно сделать во время выполнения :-)

+0

Спасибо. У меня уже есть свойства columnDefinition в качестве констант для упрощения поиска. Не знал, что аннотации могут быть перегружены, хотя - спасибо! – user1946784

+0

Спасибо, я в настоящее время заканчиваю переход на аннотации @Lob/@Column (длина = 90000), которые я предпочитаю изменять в диалоговом режиме спящего режима. Однако это, вероятно, будет моим вторым вариантом, если первый не удался. – user1946784

+0

@unknown Конечно, чем проще, тем лучше :-). – KLE