2012-01-27 78 views
5

我正在使用Hibernate并拥有一个名为“用户”的持久类。由于这是一个关键词,我打上了不同的名称@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 
+0

@TJ,我添加了错误,导致我相信它仍在使用列名。 – 2012-01-27 16:02:59

回答

1

最后,我将类用户重构为XonamiUser。这不是我想要的,但它运行得很好。

1

我有点困惑你指的是一列或表名为User ...您可以使用@Table - 注释在JPA实体集的表名:

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

我得到“不成功:创建表user_search_list(用户int8不为空,search_list varchar(255))... ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - 错误:在”用户“或其附近的语法错误 – 2012-01-27 16:14:51

1

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

这个映射应该OK,你的情况:

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

这假定用户是否是唯一的子类PropertyContainer,不是吗? – 2012-01-27 16:17:42

+0

编号Hibernate命名连接列“user”,因为它连接到一个名为“User”的实体。 – 2012-01-28 09:31:22

+0

但searchList属于PropertyContainer,所以User和其他类继承它。如果我告诉hibernate它应该使用名称user_search_list,那么它不会尝试对所有继承的类使用该名称吗? – 2012-01-28 19:34:10

30

user是PostgreSQL中reserved keyword。它只允许作为quoted identifier

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

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

+0

是的,我在原始帖子中链接的问题提出了相同的观点,这就是原因我使用了@Entity(name =“XonamiUser”)注释 – 2012-01-27 16:38:02

+0

我的错误就像ERROR:语法错误处于或接近Hibernate覆盖了Po的实际错误stgresql保留字。我花了一段时间才弄明白。 – 2016-02-26 10:06:41

+0

@BjornRoche我认为这个问题是类似于你的问题..你能帮我在这... http:// stackoverflow。COM /问题/ 42224949 /异常组织,PostgreSQL的-UTIL-psqlexception错误,语法错误,在有或近似C?noredirect = 1个#comment71610583_42224949 – dhS 2017-02-14 12:01:10

相关问题