2

私は以下の4つのクラスを持っています...

@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Platform{

    @Id
    @Column(name = "PLATFORM_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer platformId;

    ...


@Entity
@Table(name = "ANDROID_PLATFORM")
public class AndroidPlatform extends Platform{

    public AndroidPlatform(){

    }
    ...


@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Application{

    @Id
    @Column(name = "APPLICATION_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer applicationId;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PLATFORM_ID")
    private Platform platform;

    ...


@Entity
@Table(name = "ANDROID_APPLICATION")
public class AndroidApplication extends Application {
    public AndroidApplication(){

    }
    ...

プロジェクトを開始すると、次のようなエラーがスローされます

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.***.model.AndroidApplication.platform references an unknown entity: com.***.model.Platform
...

私のクラスの何が問題になっていますか、または休止状態で抽象クラスを使用するための最良のアプローチは何ですか?

助けてください。

4

2 に答える 2

2

抽象クラス Application で (および AndroidApplication の継承によって) を使用してprivate Platform platform;います。Platform は、インスタンス化できず、部分的なマッピング情報しか持たない抽象クラスです (具体的なテーブル名がありません)。

Hibernate には、読み込まれたエンティティをインスタンス化するためのパラメーターなしのコンストラクターが必要です。また、使用するクラス (abstract ではなく実装クラス) を知る必要があり、メンバー変数の型によるすべてのマッピング情報が必要です。

解決策: Application または AndroidApplication のいずれかでと交換private Platform platformする必要があり、タイプ AndroidPlatform のこの変数には hibernate アノテーションが必要です。private AndroidPlatform platform

2 番目の解決策: Java 構造がそのまま必要な場合は、xml マッピング ファイルを使用できます。メンバー変数の Java クラスがその型のスーパークラスであっても、各サブクラスで正確な型を指定する可能性があります。

于 2012-06-08T08:27:14.250 に答える
0

@Entityの代わりに使用してみてください@MappedSuperClass

于 2014-08-11T22:14:38.967 に答える