无法在postgresql hibernate中使用名为"user"的表

Pio*_*otr 19 postgresql hibernate jpa

当我尝试使用JPA/hibernate持久化一个名为"user"的实体时,它不起作用.该表未创建,因为user是postgresql中的保留字.除了命名表之外还有什么方法可以使其工作吗?

jpk*_*ing 19

要引用标识符,请使用返回标记:

@Table(name="`users`")
Run Code Online (Sandbox Code Playgroud)

从Hibernate的测试套件中查看此示例:

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

Hibernate会自动检测它并转换为您正在使用的数据库的相应引用.


Jim*_*ugh 18

JPA支持以下语法,用于指定必须严格按照指定使用表名:

@Table(name="\"user\"")
Run Code Online (Sandbox Code Playgroud)

尝试在您的实体类上使用此注释,看看它是否有效.反斜杠用于转义一组双引号,因此它看起来有点难看.


Boz*_*zho 6

我要说你应该避免使用hibernate来保存保留字的表名.当然你可以逃脱它,但它可能在将来引起问题(例如在查询中).所以最安全的方法是用另一种方式命名表 - 比如说users:

@Entity
@Table(name="users")
public class User {..}
Run Code Online (Sandbox Code Playgroud)


小智 5

PostgreSQL 遵循 ANSI 标准引用对象名称,因此需要指定“user”作为表名(包括双引号)

选择 *
来自“用户”;

我不知道你会如何告诉 hibernate 生成这样的语句。

我强烈建议您为您的表找到一个不同的名称,这会给您带来更多值得的问题。


Bas*_*que 5

正如其他人所说,user是 SQL 和 Postgres 中的保留字。

\n\n

很多数据库都有很多保留字,我上次统计的有一千多个。因此,由于保留字冲突,很容易遇到奇怪的问题。

\n\n

尾随下划线:user_

\n\n

这是我学到的有关 SQL 的最简单的技巧:始终在名称后面添加一个下划线。我对表名、列名、索引名等执行此操作。

\n\n

SQL 规范明确承诺\xe2\x80\xa0永远不会有尾随下划线的关键字或保留字。奇怪的是,这个承诺在没有上下文的情况下被插入到规范中。但对我来说,它尖叫着\xe2\x80\x9c在你所有的名字后面添加下划线!\xe2\x80\x9d。

\n\n

采用这条规则后,我发现了一个令人愉快的次要好处。当我在代码、注释、问题跟踪和电子邮件中看到下划线时,我总是知道我们特指数据库项目(例如customer_表)与 \xe2\x80\x9ccustomer\xe2\ 的概念x80\x9d 或Customer我的 Java 代码中的类。

\n\n
\n\n

\xe2\x80\xa0不幸的是,我无法引用 SQL 规范,因为它受版权保护。在SQL:2011规范中,阅读标题语法规则第 3 项、注释 111下的第 5.4 节名称和标识符。在SQL-92中,请参阅第 5.2 节第 11 项。只需搜索该单词即可。underscore

\n