Невозможно использовать таблицу с именем "user" в postgresql hibernate - PullRequest
18 голосов
/ 04 декабря 2010

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

Ответы [ 5 ]

17 голосов
/ 04 декабря 2010

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

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

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

16 голосов
/ 04 декабря 2010

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

@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 автоматически обнаружит его и преобразует в соответствующую цитату для базы данных, которую вы используете.

6 голосов
/ 04 декабря 2010

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

@Entity
@Table(name="users")
public class User {..}
4 голосов
/ 04 декабря 2010

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

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

3 голосов
/ 26 августа 2017

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

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

Подчеркивание в конце: user_

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

Спецификация SQL, в частности, обещает никогда не иметь ключевого слова или зарезервированного слова с завершающим подчеркиванием.Это обещание странным образом вставлено в спецификацию без контекста.Но для меня это кричит: «Добавьте подчеркивание ко всем вашим именам!».

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


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

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