错误:“用户”或附近的语法错误

时间:2012-01-27 15:44:49

标签: java hibernate postgresql jpa

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

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

@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的其他类似乎工作正常。

这是hibernate中的错误吗?有没有办法解决这个重构的问题?谢谢!

以下是我看到的错误(略微清理过):

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

4 个答案:

答案 0 :(得分:42)

user是PostgreSQL中的reserved keyword。仅允许quoted identifier

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

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

答案 1 :(得分:3)

如果您指的是名为User的列或表,我有点困惑...您可以使用@Table - 注释在JPA中设置实体的表名:

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

Hibernate reference manual有一个示例,显示如何定义用于保存集合元素的表名。它恰好使用User实体来实现,并将列定义为user_id而不是用户。

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

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