【发布时间】: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