2011-03-25 12 views
2

手書きJDBC ORMコードからEbeansにプロジェクトを切り替える作業を開始しました。これまでは素晴らしいことでした。 Ebeansは軽くて使いやすいです。JPA&Ebean ORM:空コレクションが空ではありません

しかし、私は厄介な問題に遭遇しました。空でなければならない1対多のリストを取得するとき、実際には1つの要素があります。この要素は、すべてのヌルフィールドを持つ何らかの種類のプロキシオブジェクトに見えるので、コレクションをループするコードが壊れます。私はここで省略定義を含めました

:すべての標準的なゲッターとセッターがどこにあるか

@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; 
} 

...です。

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」テーブルは、そのストアの行を含まない:検索コードは次のようになります。

2番目のアサーションでJUnitテストが失敗します。それは、1つの要素を持つリストを見つけます。これは、何らかの破損したStoreAlbumオブジェクトです。デバッガは、そのオブジェクトがnullable = false(およびoptional = false)として宣言されているすべてのフィールドにnull値を持つ "[email protected]"のタイプであることを示します。

ここに何か不足していますか?

+0

私はSQLデバッグをオンにして、クエリが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、C7 t1.pricecode_id 外側左ストアT0 からt1.store_id = t0.store_id ここt0.store_id = ON store_album t1に参加? オーダーby t0.store_id この動作を変更する方法が必要です – homebrew

答えて

1

私はEBeansをあきらめて、実装をMyBatisを使用するように切り替えました。 MyBatisは素晴らしいです。マニュアルは読みやすく、徹底しています。 MyBatisは、あなたが期待していることをします。私はそれを得て、すぐに走っています。

EBeanは関連付けられたコレクションの結合がヌルIDの束になったことを検出していないようですが、MyBatisはこのシナリオをきれいに処理しました。

1

同じ問題が発生し、セカンダリテーブル(StoreAlbum)にID列を追加することで解決できました。私は原因を調べなかったが、この種の状況ではEbeanがテーブルの主キーを必要としていると思う。