0

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

所以我有

   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 中,但很难确定)被保留,因此创建表失败。

我对此进行了研究,并发现了许多其他注释会影响它如何构建和命名连接表,但没有任何东西可以让我引用字段名称(同样,不能注释 QName 或 String)也不会影响列名这不需要键或值类中的注释。

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

4

1 回答 1

1

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

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

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

于 2012-04-06T18:55:51.263 回答