如何使用JPA继承

时间:2012-06-27 04:33:14

标签: jpa

我有两个类,一个是非实体类,假设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类)中的字段。我在哪里做错了..

1 个答案:

答案 0 :(得分:5)

继承非实体类不会继承持久属性。在JPA(2.0)规范中,这用以下词语告知:

  

非实体超类仅用于继承行为。该   非实体超类的状态不是持久的。任何州   从非实体超类继承的是非持久性的   继承实体类。

如果您的目标是仅继承持久性映射,那么使用MappedSuperClass将为您的目标服务。想法是,只有持久映射才会被继承,并且可能被重用,扩展到扩展相同映射超类的多个实体。从持久性的角度来看,映射的超类A和扩展实体B之间没有关系,只是重用持久性映射。如果您的映射声音合理,则只需要将@MappedSuperClass注释添加到类A

如果要在查询和关系中使用超类A,那么它应该是实体(映射的超类将不起作用)。开始的好方法是从Java EE tutorial中读取相应的部分。