2

エンティティロールのコード

   @Embedded 
   @LazyCollection(LazyCollectionOption.FALSE)
   @CollectionOfElements
   @JoinTable(name = "TEST_TABLE", joinColumns = @JoinColumn(name = "ROLE_ID"))
   @AttributeOverrides({
      @AttributeOverride(name = "code", column = @Column(name = "TSTCODE")),
      @AttributeOverride(name = "work", column = @Column(name = "TSTWRK"))
   })
       private List<TestID> tests;  
}  

TestIDクラス

@Embeddable
@AccessType("field")
public class TestID implements Serializable 
{
   private String code;

   private String work;  

// getters, setters  
}   

例外SQLGrammarExceptionを取得する

Caused by: java.sql.SQLException: ORA-00904: "TESTS0_"."WORK": invalid identifier   

エンティティマネージャは、 @ ColumnアノテーションにあるTSTCODEとTSTWRkの代わりに、CODE列とWORK列にアクセスしようとするクエリを作成します。
何か案は?

Hibernate-アノテーション3.2.1.ga
永続性
-api1.0jboss-4.2.3.GA

アップデート:

TestIDクラスのフィールドの名前をテーブルの列名に変更すると、すべてが正常に機能します

@Embeddable
@AccessType("field")
public class TestID implements Serializable 
{
   private String tstcode;

   private String tstwks;  
4

2 に答える 2

3

削除@CollectionOfElementsして使用するだけ@Embeddedです。今のようにダブルマッピングしていると思います。また、JPA@ElementCollectionはHibernateよりも推奨され@CollectionOfElementsます。

更新:コンポーネントのコレクションをマッピングしているという事実をちょっと見逃しました。その場合、正しくマップされるように@Column(name="...")、のフィールドにを追加する必要があります。TestID組み込みコンポーネントが機能するはずの方法とは多少逆ですが、それが私が知っている唯一の方法です。

于 2012-04-30T13:07:19.437 に答える
1

休止状態の推奨事項2.2.5.3.3. Collection of basic types or embeddable objects)によると、

@ElementCollection
@CollectionTable(name="TEST_TABLE", joinColumns = @JoinColumn(name = "ROLE_ID"))
@AttributeOverrides({
     @AttributeOverride(name = "code", column = @Column(name = "TSTCODE")),
     @AttributeOverride(name = "work", column = @Column(name = "TSTWRK"))
})
于 2012-04-30T13:22:00.313 に答える