2011-07-28 68 views
1

我有以下几个层次JPA 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(); 

我得到一个错误:

Order is not mapped

基于这个帖子

http://java.dzone.com/articles/jpa-implementation-patterns-mapping

BTW, when using Hibernate proxies, be aware that lazily loading a class mapped with any of the three strategies above always returns a proxy that is an instanceof the superclass. Blockquote

其奇怪的行为,我看到的相匹配。

但是,这是奇怪的地方。如果我父类更改为

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

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

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

我到JBoss 6.0.0使用JPA 2.0使用Hibernate - 任何版本附带的JBoss

回答

1

有什么奇怪与未能查询MappedSuperClass。根据JPA 2规范:

2.11.2 Mapped Superclasses .... A mapped superclass, unlike an entity, is not queryable and must not be passed as an argument to EntityManager or Query operations. Persistent relationships defined by a mapped superclass must be unidirectional. ....

我填写的代码你张贴(不@MappedSuperclass)的空白和两个多态查询和延迟加载 似乎与Hibernate 3.5.6决赛工作。也许我以不同的方式制造了不同的东西,它涉及到丢失 部分代码。你能发布更多的例子吗?

+0

我想你说得对。我遇到了类似的问题,为@Entity交换@ MappedSuperClass修复了它。我从来没有直接询问具体的实现,但查询父母没有为我工作......直到现在。 – spaaarky21