2011-01-21 9 views
0

私はHibernateがデフォルトフェッチ戦略として怠惰を持っていることを知っていますが、私には不明なことがいくつかあります。私がしたいのは、開始タイルとしてマークされたタイルを取得することです。Hibernate Fetchを理解する

問合せ:

@NamedQuery(name = "Tile.findStartTileByGame", 
    query = "SELECT t FROM Tile t WHERE t.game = :game " + 
    "and t.startTile = true and t.blockWalkable = false") 

タイル:

public class Tile{ 

@OneToOne(mappedBy="tile") 
private GameCharacter character; 

@OneToOne(mappedBy="tile") 
private GameObject gameObject; 

がゲーム:

@OneToMany(mappedBy="game") 
private List<Tile> tiles; 

私は私のクエリを実行し、決してオブジェクトがまだ私のキャラクターとゲームオブジェクトを結合休止状態使用しています。だから私は3つのクエリがあります。私はフェッチ結合でこれを解決することができることを知っていますが、なぜ私の質問は、休止状態で両方のエントントをまったくフェッチしないのですか? fetch = FetchType.LAZYで注釈を付けても、それは照会されます。

マイDAO:

public static Tile getFreeStartTile(EntityManager em, Game game) { 
    TypedQuery<Tile> query = em.createNamedQuery("Tile.findStartTileByGame", Tile.class); 
    query.setParameter("game", game); 
    List<Tile> result = query.getResultList(); 
    ... 

私はこの問題を解決する前に、私はそれが起こる理由を理解したいと思います。 ありがとうございます。 m

答えて

5

理由は、それらがnullableとマークされていることです。プロキシが使われるとき、Hibernateはプロキシと実際には単純なnullであるものとの違いを知る必要があります。

リレーションシップがコレクションの場合は、コレクションを空にして後でチェックすることができます。しかし、それがOneToOneのときは、フィールドをヌルにするか、プロキシで遅延ロードできるかを調べるために、DBを調べなければなりません。とにかく見なければならないので、ただロードするだけです。

fetch=FetchType.LAZYoptional=falseの両方に印を付けると、onetoneでの遅延取得が可能になります。もちろん、実際の列がNULL可能であれば、あなたはSOLです。私は私の答えを見つけた

+0

ああ私は、なぜこの今はるかに理解私のケースは怠惰な読み込みをしませんでした。お疲れ様でした! – mkuff