我已經開始將手寫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)的字段,該值爲空值。
我在這裏錯過了什麼嗎?
我已經打開了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