java - 尝试使用 JPA 注释保存具有复合键和基本值的映射

标签 java hibernate postgresql jpa annotations

我有一个带有 map 的实体。我在 PostgreSQL 上使用 Hibernate。映射中的类是由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

显然,这意味着其中一个字符串中的顺序字段(最有可能在 QName 中,但很难确定)被保留,因此创建表失败。

我对此进行了研究,发现了许多其他注释会影响连接表的构建和命名方式,但没有任何注释允许我引用字段名称(同样,无法注释 QName 或 String)也不会影响不需要在键或值类中进行注释的列名称。

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

最佳答案

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

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

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

关于java - 尝试使用 JPA 注释保存具有复合键和基本值的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10047600/

相关文章:

java - 无法在浏览器窗口中查看警报

java - 将 Vespa 扩展为 500 QPS 以进行搜索

hibernate - 使用 Tomcat 6.0 作为 java web 应用程序的服务器导致 javax.persistence 注释被搞乱

java - 如何忽略单元测试中的某些字段,Hibernate

postgresql - 使用 Play Framework Anorm,如何获取插入时自动生成的 id?

sql - 将脚本从 MSSQL 转换为 PL/pgSQL

java - 如何将输入文本的值传递给jsp变量?

java - 如何从 Enum 中的 Spring Messagesource 读取内容?

java - Hibernate - 有选择地打印日志中的查询

linux - 库存 pg_hba.conf 文件中需要什么权限才能允许数据库角色进入?