【问题标题】:ERROR: syntax error at or near "user"错误:“用户”处或附近的语法错误
【发布时间】:2012-02-20 14:24:20
【问题描述】:

我正在使用 Hibernate,并且有一个名为“User”的持久类。由于这是一个关键字,我用不同的名称标记了@Entity 属性(例如,我见过这个问题: Unable to use table named "user" in postgresql hibernate)

但是,我仍然遇到了麻烦,因为这个类扩展了另一个,而且看起来 hibernate 仍在尝试使用“用户”作为列名并且搞砸了:

@Entity( name = "XonamiUser" )
public class User extends PropertyContainer {
    ...

@MappedSuperclass
public abstract class PropertyContainer implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long key;
    /** tags */
    @ElementCollection
    protected Set<String> tags;

    @ElementCollection
    protected Set<String> searchList;
    ...

我的其他扩展 PropertyContainer 的类似乎工作正常。

这是休眠中的错误吗?有没有办法绕过这个重构?谢谢!

这是我看到的错误(稍微清理一下):

WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into user_search_list (user, search_list) values ('1', 'bjorn') was aborted.  Call getNextException to see the cause.
WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: syntax error at or near "user"
  Position: 31

【问题讨论】:

  • @TJ,我添加了导致我相信它仍在使用列名的错误。

标签: java hibernate postgresql jpa


【解决方案1】:

user 是 PostgreSQL 中的 reserved keyword。只允许使用quoted identifier

您必须强制 Hibernate 在此 INSERT 命令中使用带引号的 "user"

我不是 Hibernate 专家,但也许这个 Hibernate saving User model to Postgres 会有所帮助?

【讨论】:

  • 是的,我在原始帖子中链接到的问题表达了同样的观点。这就是我使用 @Entity(name = "XonamiUser") 注释的原因。
  • 我的错误类似于 ERROR: syntax error at or near。 Hibernate 为保留字覆盖 Postgresql 的实际错误。我花了一段时间才弄明白。
  • @BjornRoche 我认为这个问题与你的问题相似。你能帮我解决这个问题吗...stackoverflow.com/questions/42224949/…
  • 我在@column(name="\"user\"")修复的实体内部遇到了这个问题
【解决方案2】:

我有点困惑,你指的是名为 User 的列或表...你可以使用 @Table-annotation 为 JPA 中的实体设置表名:

@Entity
@Table(name = "XonamiUser")
public class User extends PropertyContainer {

【讨论】:

  • 我得到“不成功:创建表 user_search_list(用户 int8 不为 null,search_list varchar(255))... 错误 org.hibernate.tool.hbm2ddl.SchemaUpdate - 错误:在或附近出现语法错误”用户”
【解决方案3】:

最后,我将类用户重构为 XonamiUser。这不是我想要的,但效果很好。

【讨论】:

    【解决方案4】:

    Hibernate reference manual 有一个示例显示如何定义用于保存集合元素的表名。它碰巧使用了一个用户实体来执行此操作,并将列定义为user_id 而不是用户。

    对于您的情况,此映射应该没问题:

    @ElementCollection
    @CollectionTable(name = "user_search_list", 
                     joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "search_list")
    protected Set<String> searchList;
    

    【讨论】:

    • 这假定 User 是唯一一个继承 PropertyContainer 的类,不是吗?
    • 没有。 Hibernate 将连接列命名为“user”,因为它连接到一个名为“User”的实体。
    • 但是searchList属于PropertyContainer,所以User和其他类都继承了它。如果我告诉 hibernate 它应该使用名称 user_search_list,那么它不会尝试为所有继承的类使用该名称吗?
    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 2017-07-15
    • 2010-12-24
    • 2016-07-10
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多