如何使用JPA继承

use*_*746 0 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
   }
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我运行应用程序时,它正在创建仅包含在B类中定义的字段的表.表中没有超类(A类)中的字段.我在哪里做错了...

Mik*_*unu 5

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

非实体超类仅用于继承行为.非实体超类的状态不是持久的.从非实体超类继承的任何状态在继承实体类中都是非持久的.

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

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