Вопрос-ответ

How to map an entity field whose name is a reserved word in JPA

Как отобразить поле сущности, имя которого является зарезервированным словом в JPA
@Column(name="open")

Использование диалекта sqlserver с hibernate.

[SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid))
[SchemaUpdate] Incorrect syntax near the keyword 'open'.

Я ожидал, что hibernate будет использовать идентификатор в кавычках при создании таблицы.

Есть идеи о том, как справиться с этим ... кроме переименования поля?

Переведено автоматически
Ответ 1

С Hibernate в качестве поставщика JPA 1.0 вы можете экранировать зарезервированное ключевое слово, заключив его в обратные метки:

@Column(name="`open`")

Это синтаксис, унаследованный от ядра Hibernate:


5.4. Идентификаторы, заключенные в SQL-кавычки


Вы можете заставить Hibernate заключать идентификатор в кавычки в сгенерированном SQL, заключив имя таблицы или столбца в обратные метки в документе сопоставления. Hibernate будет использовать правильный стиль кавычек для диалекта SQL. Обычно это двойные кавычки, но SQL Server использует квадратные скобки, а MySQL использует обратные знаки.


<class name="LineItem" table="`Line Item`">
<id name="id" column="`Item Id`"/><generator class="assigned"/></id>
<property name="itemNumber" column="`Item #`"/>
...
</class>

В JPA 2.0 синтаксис стандартизирован и становится:

@Column(name="\"open\"")

Ссылки

Вопросы по теме

Ответ 2

Возникла та же проблема, но с именем таблицы Transaction. Если вы установите

hibernate.globally_quoted_identifiers=true

Тогда все идентификаторы базы данных будут заключены в кавычки.

Нашел свой ответ здесь Специальный символ в имени таблицы hibernate выдает ошибку

И нашел все доступные настройки здесь https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

Не удалось найти лучших документов для этого.

В моем случае настройка была в моем файле Spring properties . Как упоминалось в комментариях, это также могло быть в других файлах конфигурации, связанных с гибернацией.

Ответ 3

Экранирование зарезервированных ключевых слов вручную

Если вы используете JPA, вы можете заключить его в двойные кавычки:

@Column(name = "\"open\"")

Если вы используете собственный API Hibernate, вы можете экранировать их с помощью обратных меток:

@Column(name = "`open`")

Автоматическое экранирование зарезервированных ключевых слов

Если вы хотите автоматически экранировать зарезервированные ключевые слова, вы можете установить значение для true свойства конфигурации, зависящего от спящего режима hibernate.globally_quoted_identifiers:

<property
name="hibernate.globally_quoted_identifiers"
value="true"
/>

Формат Yaml

spring:
jpa:
properties:
hibernate:
globally_quoted_identifiers: true
Ответ 4

Если вы используете, как показано ниже, это должно сработать

@Column(name="[order]")
private int order;
2023-10-14 13:57 java hibernate jpa