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

Невозможно использовать таблицу с именем "пользователь" в hibernate postgresql

Когда я пытаюсь сохранить объект с именем "user" с JPA/hibernate, он не работает. Таблица не создана, и это потому, что пользователь является зарезервированным словом в postgresql. Есть ли какой-либо способ, кроме как назвать таблицу чем-то еще, чтобы сделать эту работу?

4b9b3361

Ответ 1

Чтобы указать идентификатор, используйте обратные тики:

@Table(name="`users`")

См. этот пример из набора тестов Hibernate:

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/test/quote/User.java#L31

Hibernate автоматически обнаружит его и преобразует в соответствующую цитату для используемой базы данных.

Ответ 2

JPA поддерживает следующий синтаксис для указания того, что имя_таблицы должно использоваться точно так, как указано:

@Table(name="\"user\"")

Попробуйте использовать эту аннотацию в своем классе сущности и посмотрите, не делает ли это трюк. Обратные косые черты используются для выхода из одного набора двойных кавычек, поэтому он выглядит как уродливый.

Ответ 3

Я бы сказал, что вам следует избегать иметь имена таблиц, которые являются зарезервированными словами, с гибернацией. Конечно, вы можете избежать этого, но это может вызвать проблемы в будущем (например, в запросе). Таким образом, самый безопасный способ - назвать таблицу другим способом - скажем users:

@Entity
@Table(name="users")
public class User {..}

Ответ 4

PostgreSQL следует стандарту ANSI для цитирования имен объектов, поэтому вам нужно указать "пользователь" в качестве имени табуляции (включая двойные кавычки)

SELECT *
FROM "user";

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

Я настоятельно рекомендую вам найти другое имя для вашей таблицы, это даст вам больше проблем, которые стоит.

Ответ 5

Как говорили другие, user является зарезервированным словом в SQL и Postgres.

Во многих базах данных есть много зарезервированных слов, более тысячи в последний раз, когда я подсчитывал. Таким образом, очень легко запустить в странную проблему из-за зарезервированного столкновения слов.

Подтяжка подчеркивания: user_

Вот самый удобный совет, который я когда-либо изучал для SQL: Always добавить конечное подчеркивание к вашим именам. Я делаю это для имен таблиц, имен столбцов, имен индексов и т.д.

Спецификация SQL специально promises никогда не имеет ключевого слова или зарезервированного слова с завершающим подчеркиванием. Это обещание странно вставляется в спецификацию без контекста. Но для меня это кричит "Приложите подчёркивание всем вашим именам!".

После принятия этого правила я обнаружил приятную вторичную выгоду. Когда я вижу подчеркивание в коде, в комментариях, в отслеживании проблем и в письмах, я всегда знаю, что мы конкретно ссылаемся на элемент базы данных, такой как таблица customer_ в сравнении с понятием "клиент" или класс Customer в моем Java-коде.


Я не могу процитировать спецификацию SQL, потому что, к сожалению, она защищена авторским правом. В SQL:2011 spec, прочтите раздел 5.4 Имена и идентификаторы в заголовке "Правила синтаксиса", пункт 3, ПРИМЕЧАНИЕ 111. В SQL-92 см. раздел 5.2, пункт 11. Просто поиск слова underscore будет работать.