jpa - 从层次结构中检索的实体的类

标签 jpa

在我的项目中,我有一个 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/

相关文章:

java - 什么是 @JoinColumn 以及它在 Hibernate 中的使用方式

java - 如何在 java EE 8 中使用相同的实体管理器实现通用 DAO

java - 有没有办法让 eclipselink/JPA 使用 redis 来保存和检索持久性单元级 (L2) 缓存?

java - 转换头痛

java - 在多列上创建复合唯一约束

java - 按不在分组依据中或封装在聚合中的列排序

java - 如何在外部实体上生成 query-dsl Q 类?

java - Spring Data JPA删除 native 查询抛出异常

java - JPA EntityManager 的设计负责人

jpa - 查询DSL/JPQL : how to build a join query?