如果继承类型是SingleTable,则EclipseLink在查询子类时使用不正确的表名

时间:2017-05-24 06:51:33

标签: jpa eclipselink single-table-inheritance

我有三个使用JPA / EclipseLink的实体:

@Entity(name = "Sharing")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class AbstractSharingEntity extends AbstractEntity {

@Entity(name = "InternalSharing")
public class InternalSharingEntity extends AbstractSharingEntity {

@Entity(name = "ExternalSharing")
public class ExternalSharingEntity extends AbstractSharingEntity {

如果我为AbstractSharingEntity创建一个类型化查询(“... FROM Sharing ...”),EclipseLink将使用指定的实体名称创建正确的查询。

但是如果我为两个子类之一创建一个类型化查询(例如“... FROM InternalSharing ...”),EclipseLink会使用类名作为表名而不是使用实体名来创建错误的查询。这会导致以下错误:

java.sql.SQLSyntaxErrorException: Table 'db.ABSTRACTSHARINGENTITY' doesn't exist

我犯了什么错误,这是预期的行为吗?如何在不更改类名/删除不同实体名的情况下为子类创建有效查询?

1 个答案:

答案 0 :(得分:0)

你的期望是正确的恕我直言。如果未指定表名,则默认表名为“ entityName ”,并且由于您覆盖了“Abstract”类的实体名称,因此使用的表应为SHARING。并且由于它具有该继承,因此也应该将其用于子类。

所有这些查询都应该生成表单

的查询
"SELECT ... FROM SHARING ..."

提出JPA提供程序的错误。

注意:这假定AbstractEntity 是JPA实体。

当然,您需要在该模型上使用鉴别器,并且您的“抽象”类可能应该是abstract