Подтвердить что ты не робот

Создание поля с зарезервированным именем слова с 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'.

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

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

4b9b3361

Ответ 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:

5.4. Идентификаторы с кодами SQL

Вы можете заставить 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\"")

Ссылки

Связанные вопросы

Ответ 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) автоматически цитируют идентификатор для вас, поэтому вы никогда не получите это.