2012-03-01 92 views
0

我正在使用IBM RAD 7.5和WebSphere 7.我的JPA實體的OneToMany關係中缺少什麼?

我有兩個OneToMany關係的實體(比如Customer和Order)。當我使用訂單創建客戶時,兩個實體都會正確保持。我有fetch = FetchType.EAGER,但是當我讀取Customer實體時,它不包含任何Orders。

我在做什麼錯?下面是一些代碼...

@Entity 
@Table(name="CC_CUSTOMER") 
public class Customer implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private BigDecimal id; 
    @OneToMany(cascade=CascadeType.ALL,mappedBy="customer",fetch=FetchType.EAGER) 
    private List<Order> orderList; 
    public List<Order> getOrderList() { return this.orderList; } 
    public void setOrderList(List<Order> orderList) { this.orderList = orderList; } 
    /*...*/ 
} 

......還有......

@Entity 
@Table(name="CC_ORDER") 
public class Order implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 
    @ManyToOne 
    @JoinColumn(name="customerid",nullable=false) 
    private Customer customer; 
    public Customer getCustomer() { return this.customer; } 
    public void setCustomer(Customer customer) { this.customer = customer; } 
    /*...*/ 
} 

我在做什麼錯?
此外,這裏就是我的DAO的樣子......

@Stateless 
public class CustomerDAO { 
    public List<Customer> getAll() { 
    List<Customer> customers = new ArrayList<Customer>(); 
    EntityManager em = getEntityManager(); 
    try { 
     Query query = em.createQuery("select c from Customer c"); 
     customers.addAll(query.getResultLists()); 
    } finally { 
     em.close(); 
    } 
    } 
    return customers; 
} 

任何意見或建議,不勝感激,謝謝! Rob

+0

您如何保存您的實體?...堅持訂單或堅持客戶? – 2012-03-01 17:49:55

+0

我假設你在發佈你的代碼時在'getOrderList'方法中創建了一個類型? – Perception 2012-03-01 17:50:58

+0

我堅持客戶。具體來說:'客戶c =新客戶();訂單o =新訂單(); 。c.getOrderList()添加(O); customerDAO.createCustomer(C);」 – 2012-03-01 17:53:36

回答

1

你的班級定義對我來說都很好。看起來底層的JPA實現不會通過查詢拉入關聯的對象。你可以像這樣明確地拉他們:

Query query = em.createQuery("select distinct c from Customer c left join fetch c.orderList"); 
customers.addAll(query.getResultLists()); 

這將加入客戶的所有訂單,並返回正確填充的對象。

+0

感謝@Perception,工作。對於其他人閱讀,我仍然不確定爲什麼我必須在該查詢中包含「加入」部分。看起來像fetch = FetchType.EAGER應該完成同樣的事情。感謝您的任何其他想法! – 2012-03-01 18:44:16