当我尝试使用JPA / hibernate持久化一个名为“user”的实体时,它不起作用。该表未创建,因为user是postgresql中的保留字。除了命名表之外,还有什么方法可以使其工作吗?
答案 0 :(得分:17)
JPA支持以下语法,用于指定必须严格按照指定使用表名:
@Table(name="\"user\"")
尝试在您的实体类上使用此注释,看看它是否有效。反斜杠用于转义一组双引号,因此它看起来很丑陋。
答案 1 :(得分:16)
引用标识符,请使用返回标记:
@Table(name="`users`")
从Hibernate的测试套件中查看此示例:
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
即可。