Создание поля с зарезервированным именем слова с помощью JPA - PullRequest
68 голосов
/ 08 февраля 2010
@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'.

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

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

Ответы [ 7 ]

118 голосов
/ 12 августа 2010

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

@Column(name="`open`")

Это синтаксис, унаследованный от Hiberate Core:

5,4. SQL-идентификаторы в кавычках

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

<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\"")

Ссылки

Похожие вопросы

38 голосов
/ 10 ноября 2017

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

hibernate.globally_quoted_identifiers=true

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

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

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

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

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

15 голосов
/ 29 июля 2010

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

@Column(name="[order]")
private int order;
10 голосов
/ 27 декабря 2015
@Column(name="\"open\"")

Это сработает наверняка, та же проблема случилась со мной, когда я изучал спящий режим.

4 голосов
/ 08 февраля 2010

Нет - изменить имя столбца.

Это зависит от базы данных, и вы просто не можете создать такой столбец. После всего hibernate наконец-то отправляет DDL в базу данных. Если вы не можете создать действительный DDL с этим именем столбца, это означает, что hibernate также не может. Я не думаю, что цитирование решит проблему, даже если вы пишете DDL.

Даже если вам как-то удастся избежать имени - измените его. Он будет работать с этой базой данных, но не будет работать с другой.

3 голосов
/ 29 января 2019

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

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

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

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

@Column(name = "`open`")

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

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

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

Для получения более подробной информации, ознакомьтесь с моей статьей .

0 голосов
/ 02 марта 2015

Некоторые реализации JPA (например, та, которую я использую, DataNucleus) автоматически указывают идентификатор для вас, поэтому вы никогда не получите это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...