我有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中使用抽象类的最佳方法是什么?
请帮忙。
答案 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