2011-03-25 118 views
2

我已經開始將手寫JDBC ORM代碼轉換爲Ebeans的項目。到目前爲止,這很棒; Ebeans輕巧易用。JPA和Ebean ORM:空集合不爲空

但是,我遇到了一個嚴重的問題:當檢索一個應該是空的一對多列表時,實際上有一個元素。這個元素看起來是一種具有所有空字段的代理對象,所以它破壞了通過集合循環的代碼。

我已經包括縮的定義在這裏:

@Entity 
class Store { 
    ... 
    @OneToMany(mappedBy="store",cascade=CascadeType.ALL,fetch=FetchType.LAZY) 
    List<StoreAlbum> storeAlbums = new LinkedList<StoreAlbum>(); 
} 

@Entity 
class StoreAlbum { 
    ... 
    @ManyToOne(optional=false,fetch=FetchType.EAGER) 
    @JoinColumn(name="store_id",nullable=false) 
    Store store; 
} 

的......是所有標準的getter和setter方法。檢索代碼如下所示:

Store s = server.find(Store.class) 
      .where() 
      .eq("store_id",4) 
      .findUnique(); 

Assert.assertEquals("Sprint",s.getStoreName()); 
Assert.assertEquals(0, s.getStoreAlbums().size()); 

數據庫已知含有「存儲」行了「衝刺」,和「store_album」表不包含對於存儲任何行。

JUnit測試在第二個斷言上失敗。它找到一個包含1個元素的列表,這是某種破碎的StoreAlbum對象。調試器顯示該對象的類型爲「[email protected]」,對於所有聲明爲nullable = false(和optional = false)的字段,該值爲空值。

我在這裏錯過了什麼嗎?

+0

我已經打開了SQL調試,並注意到查詢正在執行一個「left outer join」store_album表: select t0.store_id c0,t0.store_name c1,t0.platform_name c2,t0.dsp_id C3 ,t1.store_id C4,C5 t1.album_id,t1.dsp_id C6,從商店T0 t1.pricecode_id C7 左外連接上t1.store_id = t0.store_id 其中t0.store_id = store_album T1? order by t0.store_id 必須有方法來改變這種行爲 – homebrew 2011-03-25 17:23:21

回答

1

以爲我會發佈一個更新......我最終放棄了EBeans,而是將實施切換到使用MyBatis。 MyBatis很棒;該手冊易於閱讀和徹底。 MyBatis做你期望的事情。我立刻就知道了它的運行。

EBeans似乎沒有檢測到關聯集合的連接導致了一堆null id,但MyBatis乾淨地處理了這種情況。

1

我遇到了同樣的問題,並能夠通過向輔助表(StoreAlbum)添加標識列來解決此問題。我沒有調查原因,但我認爲Ebean在這種情況下需要桌面上的主鍵。