2011-07-28 69 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