在我的项目中,我有一个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).在某些方面,我需要分配的Sites 列表Employee(注意,我已经定义的关系是Locations).
使用Hibernate 3.2,我可以Location通过判别式编写查询和过滤; 返回的类是更具体的子类vg的实例:
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
更新:
在orden中澄清我想要的东西,这是我实施的"安全警报".请记住,该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++中切片.
在JPA从2.0版本开始,您就拥有了该TYPE(e)功能.规范示例:
SELECT e FROM Employee e WHERE TYPE(e) IN (Exempt, Contractor)
摘自JPA 2.0规范(4.6.17.4实体类型表达式):
实体类型表达式可用于限制查询多态性.TYPE运算符返回参数的确切类型.
注意JPA.另一方面,您的示例对基本的JPA机制产生了怀疑,我想再次强调:当您从DB获取一行(使用JPA查询)并使用特定于该Site实体的鉴别器值时,您可以确定Java object将是该类的实例(即类的实例Site).现在我相信规范并没有强制提供者它的类是Site(即fetchedEntity.getClass()==Site.class),但你可以100%肯定fetchedEntity instanceof Site返回true.
注意Hibernate.根据我对Hibernate的经验,我只能fetchedEntity.getClass() == Site.class在Hibernate中添加返回true(当然除此之外fetchedEntity instanceof Site).
| 归档时间: | 
 | 
| 查看次数: | 731 次 | 
| 最近记录: |