【问题标题】:JPA TABLE_PER_CLASS problems with ManyToOneManyToOne 的 JPA TABLE_PER_CLASS 问题
【发布时间】:2011-10-14 18:59:58
【问题描述】:

我有以下层次结构

@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

顺便说一句,在使用 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 附带的任何版本

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为你做对了。我遇到了类似的问题并将@MappedSuperClass 换成@Entity 修复了它。我从来没有直接查询具体的实现,但查询父级对我不起作用......直到现在。
    猜你喜欢
    • 2013-06-17
    • 2018-07-22
    • 1970-01-01
    • 2016-12-27
    • 2021-06-15
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多