2

非ジェネリック クラスのスーパークラスであるジェネリック クラスがあり、これらはジェネリック パラメータを次のように設定しているだけです。

@ManagedProperty
class A<T>{
    @Id
    getId(){..}
    setID(int id){..}
    int id

    T t;
    T getT(){...}
    setT(T t){...}
}

@Entity
class B extends A<Integer>{}

しかし、私は言う MappingException を取得します:

バインドされていない型があり、明示的なターゲット エンティティはありません。この一般的な使用の問題を解決するか、明示的なターゲット属性を設定してください。

どのように修正すればよいですか?

4

1 に答える 1

0

あなたの例はうまくいきません。getT() はパッケージ プライベートとして定義されています。つまり、サブクラス B では表示されません。Hibernate がリフレクションを使用してクラスを解析すると、メソッド getT() を見つけることができますが、このメソッドはサブクラスでは表示されないため、リフレクションは表示されます。タイプを提供しません。

できること:

  1. getT() を public または少なくとも protected として定義します。(これで問題が解決するかどうかはわかりません。)
  2. @Type アノテーションを使用して、Hibernate の具象型を定義します (そうすると、ジェネリック クラスで得た利点が失われる可能性があります)。
  3. クラス B の注釈の代わりに xml 構成ファイルを使用します。そこでクラス B の構成を定義します。そこでは、スーパークラスでプライベートまたはパッケージ プライベートとしてのみ定義されているメンバーとゲッターのタイプを設定することもできます。
  4. 1. に加えて、B でもメソッド getT() を定義し、そこで super.getT() を呼び出すだけです。

私はいつも解決策 3 を実行します - とにかく注釈は好きではありません ;-)

于 2012-10-25T07:18:39.243 に答える