0

我有一个带有 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 是空的......

4

1 回答 1

0

这里问了同样的问题:http: //www.eclipse.org/forums/index.php/t/406338/ 似乎与错误https://bugs.eclipse.org/bugs/show_bug.cgi?id有关= 265702已修复但已回归。如果您在最新版本中看到此错误,则应为其提交一个新错误。

如果您只使用单个 Servide 子类,则可能希望将其设为 mappedSuperclass。如果不是,通常建议使用不同的继承类型,例如连接表或单表。此错误似乎只影响 DDL 生成,因此您可以切换到让 JPA 创建一个脚本,然后您可以编辑该脚本以删除 AbstractService 表条目。

于 2014-02-13T15:28:06.720 回答