Создание поля с зарезервированным именем слова с JPA
@Column(name="open")
Использование диалекта sqlserver с гибернацией.
[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'.
Я бы ожидал, что спящий режим будет использовать цитируемый идентификатор при создании таблицы.
Любые идеи о том, как справиться с этим... кроме переименования поля?
Ответы
Ответ 1
Была такая же проблема, но с табличным именем Transaction
. Если вы установите
hibernate.globally_quoted_identifiers=true
Тогда все идентификаторы базы данных будут заключены в кавычки.
Нашел мой ответ здесь Специальный символ в названии таблицы hibernate дает ошибку
И нашел все доступные настройки здесь https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html
Не могу найти лучшие документы для этого, хотя.
В моем случае настройка была в моем файле свойств Spring. Как уже упоминалось в комментариях, это могут быть и другие файлы конфигурации, связанные с гибернацией.
Ответ 2
С Hibernate как поставщик JPA 1.0 вы можете избежать зарезервированного ключевого слова, заключая его в обратные ссылки:
@Column(name="`open`")
Это синтаксис, унаследованный от Hiberate Core:
Вы можете заставить Hibernate процитировать идентификатор в сгенерированном SQL включая имя таблицы или столбца в backticks в картографическом документе. Hibernate будет использовать правильные стиль цитаты для SQL Dialect. Обычно это двойные кавычки, но 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\"")
Ссылки
- Справочное руководство Hibernate
- Спецификация JPA 2.0
- 2.13 Именование объектов базы данных
Связанные вопросы
Ответ 3
Если вы используете, как показано ниже, он должен работать
@Column(name="[order]")
private int order;
Ответ 4
@Column(name="\"open\"")
Это будет работать точно, такая же проблема произошла со мной, когда я учил спящий режим.
Ответ 5
Экранирование вручную зарезервированных ключевых слов
Если вы используете JPA, вы можете избежать двойных кавычек:
@Column(name = "\"open\"")
Если вы используете собственный API Hibernate, вы можете избежать их с помощью обратных галочек:
@Column(name = "'open'")
Автоматическое экранирование зарезервированных ключевых слов
Если вы хотите автоматически экранировать зарезервированные ключевые слова, вы можете установить для true
специфическое для Hibernate свойство конфигурации hibernate.globally_quoted_identifiers
:
<property
name="hibernate.globally_quoted_identifiers"
value="true"
/>
Подробнее читайте в этой статье.
Ответ 6
Нет - измените имя столбца.
Это зависит от базы данных, и вы просто не можете создать такой столбец. В конце концов hibernate отправляет DDL в базу данных. Если вы не можете создать действительный DDL с этим именем столбца, это означает, что спящий режим также не может быть. Я не думаю, что цитирование решит проблему, даже если вы пишете DDL.
Даже если вам удастся избежать имени - измените его. Он будет работать с этой базой данных, но не будет работать с другим.
Ответ 7
Некоторые реализации JPA (например, тот, который я использую, DataNucleus) автоматически цитируют идентификатор для вас, поэтому вы никогда не получите это.