【问题标题】:Hibernate saving User model to PostgresHibernate 将用户模型保存到 Postgres
【发布时间】:2011-04-06 05:22:30
【问题描述】:

我正在通过 Hibernate(注释)使用 Postgres,但它似乎在处理用户对象时失败了:

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 自己这样做呢?

提前致谢。

【问题讨论】:

  • 避免使用这样的名称通常是一个好习惯
  • ....特别是如果您定期切换数据库,因为一个数据库中的标识符可能是另一个数据库中的关键字。好的样式是与您的应用程序相关的前/后缀:“myapp_user”作为表名而不是“用户”...

标签: java hibernate postgresql orm


【解决方案1】:

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

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

在 JPA 2.0 中,标准化语法如下所示:

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

参考文献

【讨论】:

  • Hibernate 默认不引用表名有什么原因吗?我想不出任何情况下这不会有用。
  • @Mr.Omsn:默认情况下引用是关闭的,因为 JPA 查询语言将被翻译成普通的 SQL。在 SQL 中,表名和列名等标识符区分大小写 in。所以 SQL 会认为 userUser 是同一张表。 BUT "User""user" 将是不同的表,它们也可以同时存在。 PostgreSQL 和 SQL 标准的唯一区别是:PG 折叠成小写,而 SQL 折叠成大写。
【解决方案2】:

用户是a key word,请找到更好的名称或使用引号:“用户”。 (恕我直言,这是个坏主意,但如果你在任何地方这样做,它就会起作用)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2023-03-18
    • 2020-10-16
    • 2011-01-14
    • 2019-06-15
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多