Конкретные значения columnDefinition базы данных Hibernate

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

некоторые аннотации @Column выглядят так:

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

или

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

С атрибутами columnDefinition, специфичными для mysql

на postgres, например, значения columnDefinition должны быть "bytea " и"varchar(999999)"

и на Oracle, вероятно, что-то еще.

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

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

кто-нибудь знает какие-либо альтернативы? Hibernate конкретные обходные пути в порядке, например, если columnDefinition атрибут может содержать диалектные значения, такие как

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

спасибо Хольгер!--4-->

2 ответов


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

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

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


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

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

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