Pio*_*otr 19 postgresql hibernate jpa
当我尝试使用JPA/hibernate持久化一个名为"user"的实体时,它不起作用.该表未创建,因为user是postgresql中的保留字.除了命名表之外还有什么方法可以使其工作吗?
jpk*_*ing 19
要引用标识符,请使用返回标记:
@Table(name="`users`")
Run Code Online (Sandbox Code Playgroud)
从Hibernate的测试套件中查看此示例:
Hibernate会自动检测它并转换为您正在使用的数据库的相应引用.
Jim*_*ugh 18
JPA支持以下语法,用于指定必须严格按照指定使用表名:
@Table(name="\"user\"")
Run Code Online (Sandbox Code Playgroud)
尝试在您的实体类上使用此注释,看看它是否有效.反斜杠用于转义一组双引号,因此它看起来有点难看.
我要说你应该避免使用hibernate来保存保留字的表名.当然你可以逃脱它,但它可能在将来引起问题(例如在查询中).所以最安全的方法是用另一种方式命名表 - 比如说users
:
@Entity
@Table(name="users")
public class User {..}
Run Code Online (Sandbox Code Playgroud)
小智 5
PostgreSQL 遵循 ANSI 标准引用对象名称,因此需要指定“user”作为表名(包括双引号)
选择 * 来自“用户”;
我不知道你会如何告诉 hibernate 生成这样的语句。
我强烈建议您为您的表找到一个不同的名称,这会给您带来更多值得的问题。
正如其他人所说,user
是 SQL 和 Postgres 中的保留字。
很多数据库都有很多保留字,我上次统计的有一千多个。因此,由于保留字冲突,很容易遇到奇怪的问题。
\n\nuser_
这是我学到的有关 SQL 的最简单的技巧:始终在名称后面添加一个下划线。我对表名、列名、索引名等执行此操作。
\n\nSQL 规范明确承诺\xe2\x80\xa0永远不会有尾随下划线的关键字或保留字。奇怪的是,这个承诺在没有上下文的情况下被插入到规范中。但对我来说,它尖叫着\xe2\x80\x9c在你所有的名字后面添加下划线!\xe2\x80\x9d。
\n\n采用这条规则后,我发现了一个令人愉快的次要好处。当我在代码、注释、问题跟踪和电子邮件中看到下划线时,我总是知道我们特指数据库项目(例如customer_
表)与 \xe2\x80\x9ccustomer\xe2\ 的概念x80\x9d 或Customer
我的 Java 代码中的类。
\xe2\x80\xa0不幸的是,我无法引用 SQL 规范,因为它受版权保护。在SQL:2011规范中,阅读标题语法规则第 3 项、注释 111下的第 5.4 节名称和标识符。在SQL-92中,请参阅第 5.2 节第 11 项。只需搜索该单词即可。underscore
归档时间: |
|
查看次数: |
11633 次 |
最近记录: |