尝试使用JPA注释将复合键和基本值保留在地图中

时间:2012-04-06 18:26:57

标签: java hibernate postgresql jpa annotations

我有一个带有地图的实体。我在PostgreSQL上使用Hibernate。地图中的类由Java定义,不能由我注释。我正在修改的类是从我无法更改的XML Schema生成的。

所以我有

   import java.util.HashMap;
   import java.util.Map;
   import javax.xml.namespace.QName;

   @Entity public class TestClass {
   @XmlTransient
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long pk;

   ...

   @XmlAnyAttribute
   @ElementCollection(fetch = FetchType.EAGER)
   @Embedded
   private final Map<QName, String> otherAttributes = new HashMap<QName, String>();

   ...

我正在使用PostGreSQL,我收到以下错误:

Unsuccessful: create table TestClass_otherAttributes (TestClass_pk int8 not null, count int4 not null, hash int4 not null, offset int4 not null, value varchar(255), localPart varchar(255), namespaceURI varchar(255), prefix varchar(255), primary key (TestClass_pk, localPart, namespaceURI, prefix))
ERROR: syntax error at or near "offset" Position: 160

显然,这意味着其中一个字符串中的order字段(很可能是QName,但很难确定)是保留的,因此create table失败了。

我已经研究了这个,并且发现了许多影响它构建和命名的连接表的其他注释,但没有任何东西可以引用字段名称(再次,没有注释QName或String的能力)也不影响不需要键值或值类中的注释的列名。

所以我的问题是,要添加的最小注释数是多少,以便我可以保留此地图?

1 个答案:

答案 0 :(得分:1)

offset是PostgreSQL和2008标准中的保留字:

http://www.postgresql.org/docs/current/interactive/sql-keywords-appendix.html

如果您可以访问SQL,或者可以控制它的发布方式,可以将列名放在引号中(双引号字符:[“])。引用的标识符始终作为标识符,永远不会与保留字冲突。如果你不能改变列名,也不引用它,你就无法在PostgreSQL或任何符合SQL-2008的数据库产品中使用它。