0

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

4

1 回答 1

5

从非实体类继承不继承持久属性。在 JPA (2.0) 规范中,这是用以下词语来说明的:

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

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

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

于 2012-06-27T04:51:33.583 回答