在我的项目中,我有一个 JPA 层次结构 Location -> Site
.
@Entity
@Table(name = "LOCATION")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="LOC_TYPE",discriminatorType=DiscriminatorType.STRING)
public class Location {
...
}
@Entity
@DiscriminatorValue("SI")
public class Site extends Location {
...
}
现在,每
Employee
有一个列表 Location
分配(即使据我所知,所有这些位置实际上都是 Site
)。在某些方面,我需要 Site
的列表是 Employee
已分配给(注意,我定义的关系是到 Location
s)。使用 Hibernate 3.2,我只需编写
Location
的查询即可。并通过判别式过滤;返回的类是更具体的子类的实例,例如:Query query = em.createQuery("SELECT loc FROM Location loc WHERE loc.type=\"SI\"");
List<Location> locations = (List<Location>) query.getResultList();
for (Location location : locations) {
Site mySite = (Site) location;
...
}
但是,我找不到任何说明这种行为是由 JPA 规范保证还是只是 Hibernate 的实现决定的文档。在最后一种情况下,我不应该使用这种方法,因为如果我切换提供者,它可能会改变)。
你能告诉我标准是否支持我的方法吗?
顺便说一句,我在 Hibernate 3.2 上使用 JPA 1
更新:
为了澄清我想要什么,这是我实现的“安全警报”。请记住,
disc
属性是鉴别器列,所以我确信返回的对象保留为 Site
实例。Query query = em.createQuery("SELECT lo FROM Employee em JOIN em.location lo WHERE lo.disc = 'SI'");
List<Location> locations = (List<Location>) query.getResultList();
List<Site> site = new ArrayList<Site>();
for (Location location : locations) {
if (location instanceof Site) {
sites.add((Site) location);
} else {
log.warn("Found a Location that is not instance of Site");
}
}
JPA 规范是否指定我的
log.warn
语句永远不会被调用? AFAIK,也许一个实现可以返回一堆 Location
不是 Site
的实例.当然,在那种情况下只有 Location
属性将可用;这种行为有点像 C++ 中的切片。
最佳答案
在从 2.0 版开始的 JPA 中,您有 TYPE(e)
功能。规范中的示例:
SELECT e FROM Employee e WHERE TYPE(e) IN (Exempt, Contractor)
摘自 JPA 2.0 规范( 4.6.17.4 实体类型表达式 ):
An entity type expression can be used to restrict query polymorphism. The TYPE operator returns the exact type of the argument.
注意 JPA。 另一方面,您的示例对基本的 JPA 机制产生了怀疑,我想再次强调这一点:当您从 DB 中获取一行(使用 JPA 查询)时,其鉴别器值特定于
Site
实体,您可以确定 Java 对象将是该类(即 Site
类)的实例。现在我相信规范不会强制提供者它的类是 Site
(即 fetchedEntity.getClass()==Site.class
),但您可以 100% 确定 fetchedEntity instanceof Site
返回真。注意休眠。 根据我使用 Hibernate 的经验,我只能添加
fetchedEntity.getClass() == Site.class
在 Hibernate 中返回 true(当然除了 fetchedEntity instanceof Site
之外)。
关于jpa - 从层次结构中检索的实体的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21730428/