我有一个带有 Eclipselink 和 TABLE_PER_CLASS 继承策略的简单 Java EE 7 Web 应用程序。
以下课程:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
public abstract class AbstractService implements Serializable {
private static final long serialVersionUID = 7041207658121699813L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn
private PersonGroup personGroup;
}
@Entity
public class Service extends AbstractService implements Serializable {
private static final long serialVersionUID = 3817106074951672799L;
}
@Entity
public class PersonGroup implements Serializable {
private static final long serialVersionUID = 3205092801888510996L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "personGroup")
private List<AbstractService> services;
}
在persistence.xml 我做Drop&Create。
创建数据库后,我有这些表:
抽象服务、服务、人员组
现在的重点是,eclipselink 使用(仅(!))属性 persongroup_id(没有“id”属性)创建表 abstractservice。为什么?
我对 TABLE_PER_CLASS 的理解是,每个属性和键都在“下降”,因此 abstractservice 应该没有更多的属性并且不应该存在。
我的商业案例是,我有很多来自 AbstractService 的子服务。我想从具有特殊人员组的 AbstractService 获取所有子服务。
AbstractServicetable 没有条目,因为一切都在 Service 中。
使用 CriteriaBuilder 我说:
Select from AbstractService where persongroup_id = 123;
Criteria Api 应该构建它(使用一些联合,如果存在更多子服务),因为我有 TABLE_PER_CLASS:
Select from Service where persongroup_id = 123;
为什么 eclipselink 在 abstractService 中创建 persongroup_id,我该如何解决我的问题?最后查询的结果总是空的,因为 abstractService 是空的......