我有一个带有地图的实体。我在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的能力)也不影响不需要键值或值类中的注释的列名。
所以我的问题是,要添加的最小注释数是多少,以便我可以保留此地图?
答案 0 :(得分:1)
offset
是PostgreSQL和2008标准中的保留字:
http://www.postgresql.org/docs/current/interactive/sql-keywords-appendix.html
如果您可以访问SQL,或者可以控制它的发布方式,可以将列名放在引号中(双引号字符:[“])。引用的标识符始终作为标识符,永远不会与保留字冲突。如果你不能改变列名,也不引用它,你就无法在PostgreSQL或任何符合SQL-2008的数据库产品中使用它。