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

我的课程有什么问题,或者在 hibernate 中使用抽象类的最佳方法是什么?

请帮忙。

4

2 回答 2

2

在您的抽象类应用程序(以及通过继承 AndroidApplication)中,您正在使用private Platform platform;. Platform 是一个无法实例化的抽象类,它只有部分映射信息(缺少具体的表名)。

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

解决方案:你必须在Application或AndroidApplication中进行交换private Platform platformprivate AndroidPlatform platform并且这个AndroidPlatform类型的变量必须有hibernate注解。

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

于 2012-06-08T08:27:14.250 回答
0

尝试使用@Entity而不是@MappedSuperClass

于 2014-08-11T22:14:38.967 回答