如何定义两个抽象类之间的ManyToOne关系

时间:2012-06-08 07:53:31

标签: hibernate

我有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 个答案:

答案 0 :(得分:2)

在您的抽象类Application(以及AndroidApplication中的继承)中,您使用的是private Platform platform;。 Platform是一个抽象类,不能实例化,只有部分映射信息(缺少具体的表名)。

Hibernate需要一个无参数构造函数来实现加载的实体。此外,它需要知道要使用哪个类(不是抽象类而是实现类),并且它需要按成员变量的类型的所有映射信息。

解决方案:您必须在应用程序或AndroidApplication中与private Platform platform交换private AndroidPlatform platform,并且此AndroidPlatform类型的变量必须具有hibernate注释。

第二个解决方案:如果您确实需要Java结构,那么您可以使用xml映射文件。在那里,您可以在每个子类中指定确切的类型,即使成员变量的Java类是该类型的超类。

答案 1 :(得分:0)

尝试使用@Entity代替@MappedSuperClass