我有三个使用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
我犯了什么错误,这是预期的行为吗?如何在不更改类名/删除不同实体名的情况下为子类创建有效查询?
答案 0 :(得分:0)
你的期望是正确的恕我直言。如果未指定表名,则默认表名为“ entityName ”,并且由于您覆盖了“Abstract”类的实体名称,因此使用的表应为SHARING
。并且由于它具有该继承,因此也应该将其用于子类。
所有这些查询都应该生成表单
的查询"SELECT ... FROM SHARING ..."
提出JPA提供程序的错误。
注意:这假定AbstractEntity
不是JPA实体。
当然,您需要在该模型上使用鉴别器,并且您的“抽象”类可能应该是abstract