Конкретные значения 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.
Это удобно делать во время выполнения : -)