Hibernate: используйте backticks для MySQL, но не для HSQL - PullRequest
6 голосов
/ 12 января 2011

Проект, над которым я работаю (который использует Java, Spring, Hibernate), недавно был изменен с Oracle на MySQL. Есть несколько случаев, когда некоторые свойства в коде являются зарезервированными словами в MySQL, например, «release».

Существует несколько решений: 1) переименовать свойства в коде и последующих методах получения / установки, а также обновить код, который вызывает эти методы; 2) аннотировать свойство в коде с помощью @Column (name = "` release` ") , Это заставляет hibernate заключать в кавычки имя при обращении к базе данных.

Я бы предпочел держаться подальше от первого подхода, чтобы уменьшить вероятность взлома большего количества вещей. Второй подход - «хорошо», за исключением того, что он становится специфичным для MySQL. В нашей дев. В настройках мы используем HSQL, которому не нравятся запятые в именах этих столбцов.

Я посмотрел на класс org.hibernate.mapping.Column и увидел, что в нем есть методы "getQuotedName", которые я мог бы потенциально переопределить, если бы мог создать подкласс Column и сказать Hibernate использовать мой собственный класс Column.

Как лучше всего решить эту проблему, основываясь на предпочтительном подходе: а) отсутствие необходимости рефакторинга кодовой базы (b / c изменения имен свойств, методов получения и установки и т. Д.) И б) желание, чтобы приложение продолжало работать в HSQL и MySQL.

Было бы разумно иметь свойство в файле свойств, которое можно было бы переключать для включения / выключения некоторого исправления именования столбцов. Что напоминает мне, я пытался использовать собственную стратегию именования и переопределить метод columnName, чтобы заключить имя столбца в обратные метки ... это не работает, даже в MySQL.

Ответы [ 2 ]

1 голос
/ 12 января 2011

Звучит неплохо.Но если это не работает или вы не хотите использовать недокументированную функцию конкретной провайдера JPA: почему бы вообще не использовать имена столбцов, которые не зарезервированы ни в одной (или самой распространенной) базе данных.* Вам не нужно менять имя ваших свойств Java, вы должны только указать имя столбца для них.

0 голосов
/ 12 января 2011

Используйте подсказки.Это ваш способ сообщить Hibernate, что вы хотите, чтобы этот идентификатор был указан в кавычках.Это просто совпадение, что в MySQL также используются символы обратной кавычки.Этот обратный удар будет преобразован в любой символ цитирования для вашей базы данных.Что касается добавления кавычек в качестве поведения по умолчанию, я не уверен, что в Hibernate есть такая опция.Ничто в документации не упоминает о возможной опции, и я не помню, чтобы что-то подобное было и в тестовом наборе.Но я не думаю, что это хорошая идея, поскольку «зарезервированные ключевые слова» - это исключения, а не правило.

...