2017-05-24 25 views
0

我使用JPA/EclipseLink的三个实体:的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共享一个类型的查询...... 。“),EclipseLink使用指定的实体名称创建正确的查询。但如果我为两个子类之一(例如“... FROM InternalSharing ...”)创建了一个类型化查询,EclipseLink将使用类名作为表名而不是使用实体名来创建错误的查询。这会导致以下错误:

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

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

+0

打开,看到的EclipseLink说什么,当处理您的持久性单元。 – Chris

回答

0

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

所有这些查询应生成表单

"SELECT ... FROM SHARING ..." 

的查询抬起你的JPA提供者的错误。

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

你会的,当然,需要对模型鉴别,还你的“抽象”类可能应该是在记录abstract