与ManyToOne的JPA TABLE_PER_CLASS问题

时间:2011-07-28 03:31:27

标签: jpa polymorphic-associations table-per-class

我有以下层次结构

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Order {
...
@Entity
@Table(name = "b_order", schema = "public")
public class BOrder extends Order implements java.io.Serializable {
...
@Entity
@Table(name = "s_order", schema = "public")
public class SOrder extends Order implements java.io.Serializable {

我还有一个Tr,它引用了两个具体的子类

@Entity
@Table(name = "tr", schema = "public")
public class Tr implements java.io.Serializable {
...
private SOrder sOrder;
private BOrder bOrder;
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "s_order_id", nullable = false)
public SOrder getSOrder() {
   return this.sOrder;
}
... same for BOrder

使用上面定义的类,延迟加载工作正常:

Tr foundTr = trDAO.findById(trId);
// test lazy loading BOrder, SOrder
BOrder foundBOrder = foundTr.getBOrder();
SOrder foundSOrder = foundTr.getSOrder();
assertNotNull(foundSOrder);
assertNotNull(foundBOrder);

但是,如果我尝试执行多态查询,它就不起作用:

public List<Order> getOrdersByUId(Long uId) {
    return (List<Order>) em.createQuery( //
        " select o from Order o " //
            + " order by o.created desc ") //
            .getResultList();

我收到错误:

  

订单未映射

根据这篇文章:http://java.dzone.com/articles/jpa-implementation-patterns-mapping

  BTW,当使用Hibernate代理时,请注意懒惰加载一个   使用上述三种策略中的任何一种映射的类总是返回一个   代理是超类的实例。   块引用

与我看到的奇怪行为相符。

然而,这是它变得奇怪的地方。如果我将父类更改为

@Entity
// @MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Order {

即我注释掉MappedSuperClass注释,多态查询有效(创建正确的联合)。 问题是,当我这样做时,从Tr到两个子类的LAZY加载停止工作。

有什么想法吗?我可以使用本机查询来执行联合而不是JPA吗?

我正在使用Hibernate在JBoss 6.0.0中使用JPA 2.0 - 无论JBoss附带什么版本

1 个答案:

答案 0 :(得分:1)

没有查询MappedSuperClass没什么奇怪的。根据JPA 2规范:

  

2.11.2 Mapped Superclasses ....映射的超类,与实体不同,   不可查询,不得作为参数传递给   EntityManager或Query操作。由...定义的持久关系   映射的超类必须是单向的。   ....

我填写了您发布的代码中的空白(没有@MappedSuperClass)以及多态查询和延迟加载 似乎适用于Hibernate 3.5.6-Final。也许我做了一些不同的方式,它缺少什么 部分代码。你能发布更多有竞争力的例子吗?