我有两个类,一个是非实体类,假设A在所有实体类中都有公共字段,另一个是扩展实体类的实体类。我在下面定义这些类的方式。
public class A{
private Date startDate;
private Date endDate;
//setters and getters for these fields
}
@Entity
@Table(name="some table name")
public class B extends A{
private long id;
private String duration;
public B(){
}
public B(Date startDate,Date endDate,String duration){
//setter methods for the fields inside the constructor
}
//Setter ,Getter methods for the fields in B class
}
现在的问题是,当我运行应用程序时,它正在创建仅包含在B类中定义的字段的表。表中没有超类(A类)中的字段。我在哪里做错了..
答案 0 :(得分:5)
继承非实体类不会继承持久属性。在JPA(2.0)规范中,这用以下词语告知:
非实体超类仅用于继承行为。该 非实体超类的状态不是持久的。任何州 从非实体超类继承的是非持久性的 继承实体类。
如果您的目标是仅继承持久性映射,那么使用MappedSuperClass将为您的目标服务。想法是,只有持久映射才会被继承,并且可能被重用,扩展到扩展相同映射超类的多个实体。从持久性的角度来看,映射的超类A和扩展实体B之间没有关系,只是重用持久性映射。如果您的映射声音合理,则只需要将@MappedSuperClass
注释添加到类A
。
如果要在查询和关系中使用超类A,那么它应该是实体(映射的超类将不起作用)。开始的好方法是从Java EE tutorial中读取相应的部分。