Hibernate将User模型保存到Postgres

25

我正在使用基于注释的 Hibernate 连接 Postgres 数据库,但处理 User 对象时出现了问题:

12:09:16,442 ERROR [SchemaExport] Unsuccessful: create table User (id  bigserial not null, password varchar(255), username varchar(255), primary key (id))
12:09:16,442 ERROR [SchemaExport] ERROR: syntax error at or near "User"

如果我手动运行SQL,我必须在表名周围加引号,因为"User"似乎是一个postgres关键字,但我该如何让Hibernate自己执行这个操作呢?

提前感谢。


1
通常最好避免使用这样的名称,这是一个良好的编程实践。 - Denys Kniazhev-Support Ukraine
尤其是如果你经常切换数据库,因为在一个数据库中作为标识符的内容可能在另一个数据库中是关键字。良好的编程风格应该使用与应用相关的前缀/后缀,例如将表名命名为"myapp_user"而不是"user"。 - fasseg
2个回答

62

使用保留关键字时需要转义表名。 在JPA 1.0中,没有标准化的方式,而Hibernate特定的解决方案是使用反引号:

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

JPA 2.0 的标准语法如下:

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

参考资料


1
Hibernate默认不加引号的表名有什么原因吗?我想不到任何不使用引号的情况。 - Korbi
2
@Mr.Omsn:默认情况下不使用引号,因为JPA查询语言需要转换为普通的SQL。在SQL中,标识符(如表名和列名)是大小写不敏感的。所以SQL会认为userUser是同一张表。但是,"User""user"是不同的表,它们也可以同时存在。PostgreSQL和SQL标准之间唯一的区别是:PG将其折叠为小写,而SQL则转换为大写。 - A.H.

3

用户是关键词,找一个更好的名称或使用引号:"用户"。(我认为这不是一个好主意,但如果你在所有地方都这样做,它会起作用)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接