Когда я пытаюсь сохранить объект с именем "user" с JPA/hibernate, он не работает. Таблица не создана, и это потому, что пользователь является зарезервированным словом в postgresql. Есть ли какой-либо способ, кроме как назвать таблицу чем-то еще, чтобы сделать эту работу?
Невозможно использовать таблицу с именем "пользователь" в hibernate postgresql
Ответ 1
Чтобы указать идентификатор, используйте обратные тики:
@Table(name="`users`")
См. этот пример из набора тестов Hibernate:
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
будет работать.