2012-06-08 107 views
1

我有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 
... 

錯誤在我的類中,或者什麼是在hibernate中使用抽象類的最佳方法?

請幫忙。

回答

2

在您的抽象類應用程序(並通過在AndroidApplication繼承),您正在使用private Platform platform;。平臺是一個抽象類,不能實例化,只有部分映射信息(缺少具體的表名)。

Hibernate需要一個無參數構造函數來實例化加載的實體。還需要知道使用哪個類(不是抽象類,而是實現類),它需要通過成員變量的類型來獲取所有映射信息。

解決方案:您必須在應用程序或AndroidApplication中交換private Platform platformprivate AndroidPlatform platform,此類型的AndroidPlatform變量必須具有hibernate註釋。

第二種解決方案:如果您絕對需要Java結構,那麼您可以使用xml映射文件。在那裏你可以指定每個子類的確切類型,即使成員變量的Java類是該類型的超類。

0

嘗試使用@Entity而不是@MappedSuperClass