0

私はいくつかの非ジェネリッククラスのスーパークラスであるジェネリッククラスを持っており、それらは次のようにジェネリックパラメーターを設定しているだけです:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A<T>{
    @Id
    getId(){..}
    setID(int id){..}
    int id

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

@Entity
class B extends A<Integer>{}

しかし、休止状態は、Bには識別子がないと言っています。どうすればよいですか?

4

4 に答える 4

1

A を直接永続化しないが、そのサブクラスにその Hibernate アノテーションの一部 (またはすべて) を取得させたい場合は、@MappedSuperclass を使用する必要があります。

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A<T>{
    @Id
    getId(){..}
    setID(int id){..}
    int id

    T t;
    T getT(){...}
    setT(T t){...}
}
于 2012-10-22T18:01:27.530 に答える
1

クラス A にも @Entity アノテーションを追加する必要があります。属性 t の @Transient アノテーションは、2 番目の例外に役立つはずです

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A<T> {
    @Id
    getId(){..}
    setID(int id){..}
    int id

    @Transient
    T t;
    T getT(){...}
    setT(T t){...}
}
于 2012-10-22T15:56:58.200 に答える
0

多くのテストの後、抽象的な親 (単一テーブルの継承) と抽象の子テーブル (クラスごとに 1 つのテーブルの継承) で動作する Java パラメーター化を取得しようとして、私はあきらめました。

可能かもしれませんが、Hibernate が抽象 (パラメータ化された) クラスをエンティティとしてインスタンス化しようとすると、問題が発生することがよくあります。これは、「A にはバインドされていない型があり、明示的なターゲット エンティティがありません」というエラーが表示される場合です。これは、Hibernate がパラメーター化された型のパラメーター値を持っていないことを意味します。拡張クラスのテストは問題ないことがわかりましたが、親エンティティの周りのテストは壊れていました。

JPA継承を使用して書き直し、パラメーター化されたものを拡張クラスに移動することをお勧めします。そうすれば、データベースから同じポリモーフィズムを取得できます。

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CLASS_TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class ClassA {

  [...]

}

拡張子 B:

@Entity
@DiscriminatorValue=("B")
public class ClassB extends ClassA {
  @OneToOne
  @JoinColumn(name = "mycolumn_id")
  private Integer instance;

  [...]
}

拡張子 C:

@Entity
@DiscriminatorValue=("C")
public class ClassC extends ClassA {
  @OneToOne
  @JoinColumn(name = "mycolumn_id")
  private String instance;

  [...]
}
于 2015-05-22T09:04:39.907 に答える