我有三个使用 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 {
如果我为抽象共享实体创建一个类型化查询("...从共享..."(,EclipseLink 使用指定的实体名称创建正确的查询。
但是,如果我为两个子类之一创建一个类型化查询(例如"...FROM InternalSharing ..."(,EclipseLink 使用类名作为表名而不是使用实体名创建错误的查询。这会导致以下错误:
java.sql.SQLSyntaxErrorException: Table 'db.ABSTRACTSHARINGENTITY' doesn't exist
我是否犯了任何错误,这是预期的行为?如何在不更改类名/删除不同实体名的情况下为子类创建有效的查询?
我直言,您的期望是正确的。未指定表名时,默认表名为">entityName",并且由于您覆盖了"Abstract"类的实体名称,因此应SHARING
使用的表。既然它有继承,那么也应该把它用于子类。
所有这些查询都应生成表单的查询
"SELECT ... FROM SHARING ..."
在您的 JPA 提供程序上引发一个错误。
注意:这假定AbstractEntity
不是 JPA 实体。
当然,您需要在该模型上有一个鉴别器,并且您的"抽象"类可能应该abstract