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

时间:2010-12-03 23:31:08

标签: hibernate postgresql jpa

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

5 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:16)

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

@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 :(得分:6)

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

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

答案 3 :(得分:4)

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

SELECT *
FROM "user";

我不知道如何告诉hibernate生成这样的声明。

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

答案 4 :(得分:3)

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

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

尾随下划线:user_

这是我为SQL学到的最简单的提示:始终在您的名字后附加一个尾随的下划线。我这样做是为了表名,列名,索引名等。

SQL规范明确承诺永远不会有带尾随下划线的关键字或保留字。这个承诺奇怪地插入到没有上下文的规范中。但对我来说,它尖叫着“为你所有的名字加上下划线!”。

采用这条规则后,我发现了一个令人愉快的第二个好处。当我在代码,评论,问题跟踪和电子邮件中看到下划线时,我总是知道我们特指数据库项目,例如customer_表格与“客户”的概念或我的Java代码中的类Customer

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