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
ている を取得したいと思いますStock
。Player
私が使用しているクエリは次のとおりです。
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
内のクラス名は であり、 という名前のハンドラーがあります)。Contract
Player_$$_javassist_22
JavassistLazyInitializer
何が間違っているのか、他のモデルを取得しているときに Hibernate がプレーヤー モデルの取得を拒否する理由がわかりません ...
ご協力ありがとうございました
編集
いくつかのテストの後、休止状態によって実行されたクエリは正しいようです。すべての結合があり、すべてのモデルのすべてのフィールドが選択されています。
ただし、結果は奇妙です。フィールドはContract
andからのみ取得していますStock
( and からではありませんBuilding
) Player
。
しかし、Building
ロードされているのはなぜですか? キャッシュのせい?そして、なぜBuilding
andPlayer
が結果に表示されないのですか?
編集2
MySQLでまったく同じリクエストを直接実行しようとしましたが、必要なすべての変数を取得していますが、Hibernateはいくつかの変数をスキップしているようです(すべてが結果に含まれているわけではありません)。
何が起こっていますか ?
編集3
クエリを実行する前にセッションキャッシュを試してみましたがclear()
、何だと思いますか? ロードされていPlayer
ます...
Player
を使用してのみロードしようとしましleft join fetch
たが、まだ機能していませんでした (ただしBuilding
、キャッシュのおかげでロードされました)。Player's
フィールドは結果にありませんでした。ただし、キャッシュをクリアするとすぐにPlayer's
フィールドが結果にPlayer
表示され、Contract
.
キャッシュをクリアすると問題が解決したのはなぜですか? Player
キャッシュにありましたか?もしそうなら、なぜロードされなかったのですか?何が起こるかわかりませんが、この後に他の多くのクエリを作成する必要があり、それらのキャッシュが必要なため、キャッシュをクリアすることはできません。