0

マップを持つエンティティがあります。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

明らかにこれは、文字列の 1 つ (QName にある可能性が高いですが、特定するのは難しい) の順序フィールドが予約されているため、テーブルの作成が失敗していることを意味します。

私はこれを調査し、結合テーブルの作成方法と命名方法に影響を与える他の多くの注釈を見つけましたが、フィールド名を引用することはできません (QName または String に注釈を付けることはできません) も、列名にも影響を与えませんキーまたは値クラスに注釈を必要としません。

私の質問は、このマップを保持できるように追加する注釈の最小数はいくつですか?

4

1 に答える 1

1

offsetは、PostgreSQL および 2008 標準の予約語です。

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

SQL にアクセスできる場合、または SQL の出力方法を制御できる場合は、列名を引用符で囲むことができます (二重引用符文字: ["])。引用符で囲まれた識別子は常に識別子と見なされ、予約済みと衝突することはありません。列名を変更したり、引用符を付けたりすることができない場合、PostgreSQL や SQL-2008 準拠のデータベース製品で動作させることはできません。

于 2012-04-06T18:55:51.263 に答える