2

Play フレームワークと JPA と Hibernate を使用しています。

私はいくつかのエンティティを持っています:

@Entity
public class Player extends Model {

    public enum Gender {

        MALE, FEMALE
    }

    @Required
    public String name;

    @Required
    public Gender gender;

    @Required
    public Long gold;
}

@Entity
public class Building extends Model {

    @Required
    @ManyToOne(fetch = FetchType.LAZY)
    public Player owner;

    @Required
    public String buildingType;

    @Required
    public Long buildingId;
}

@Entity
public class Stock extends Model {

    // Either a product type or a raw material
    @Required
    public Long goodId;

    @Required
    public Boolean isProduct;

    @Required
    public String image;
}

@Entity
public class Contract extends Model {

    @Required
    @ManyToOne(fetch = FetchType.LAZY)
    public Player player;

    @Required
    @ManyToOne(fetch = FetchType.LAZY)
    public Building building;

    @Required
    @ManyToOne(fetch = FetchType.LAZY)
    public Stock stock;

    @Required
    public Long ordersLeft;

    @Required
    public Long cyclesLeft;
}

Contractこれらのエンティティを使用して、すべての myとそれに関連付けられBuildingている を取得したいと思いますStockPlayer

私が使用しているクエリは次のとおりです。

public static List<Contract> retrieveContractsForNewOrder() {
        return find("select distinct c from Contract c "
                + "left join fetch c.player "
                + "left join fetch c.stock "
                + "left join fetch c.building "
                + "where c.cyclesLeft = 0 and c.ordersLeft > 0").fetch();
    }

クエリは機能しています。 のリストを取得しますContract。ただし、buildingおよびstock変数はロードされますが、変数はロードされません (オブジェクトplayer内のクラス名は であり、 という名前のハンドラーがあります)。ContractPlayer_$$_javassist_22JavassistLazyInitializer

何が間違っているのか、他のモデルを取得しているときに Hibernate がプレーヤー モデルの取得を拒否する理由がわかりません ...

ご協力ありがとうございました

編集

いくつかのテストの後、休止状態によって実行されたクエリは正しいようです。すべての結合があり、すべてのモデルのすべてのフィールドが選択されています。

ただし、結果は奇妙です。フィールドはContractandからのみ取得していますStock( and からではありませんBuilding) Player

しかし、Buildingロードされているのはなぜですか? キャッシュのせい?そして、なぜBuildingandPlayerが結果に表示されないのですか?

編集2

MySQLでまったく同じリクエストを直接実行しようとしましたが、必要なすべての変数を取得していますが、Hibernateはいくつかの変数をスキップしているようです(すべてが結果に含まれているわけではありません)。

何が起こっていますか ?

編集3

クエリを実行する前にセッションキャッシュを試してみましたがclear()、何だと思いますか? ロードされていPlayerます...

Playerを使用してのみロードしようとしましleft join fetchたが、まだ機能していませんでした (ただしBuilding、キャッシュのおかげでロードされました)。Player'sフィールドは結果にありませんでした。ただし、キャッシュをクリアするとすぐにPlayer'sフィールドが結果にPlayer表示され、Contract.

キャッシュをクリアすると問題が解決したのはなぜですか? Playerキャッシュにありましたか?もしそうなら、なぜロードされなかったのですか?何が起こるかわかりませんが、この後に他の多くのクエリを作成する必要があり、それらのキャッシュが必要なため、キャッシュをクリアすることはできません。

4

3 に答える 3

0

Hibernate の列挙型、列挙型として永続化 承認された回答に焦点を当てます。
また、キャッシュなどの休止状態関連の概念については、このチュートリアルを参照してください。
http://www.youtube.com/playlist?list=PL4AFF701184976B25

于 2013-09-03T07:45:23.770 に答える
0

に変更してみてくださいFetchType.EAGER

于 2013-09-01T19:34:42.663 に答える