Я знаю, что hibernate использует ленивую стратегию получения по умолчанию, но есть некоторые вещи, которые мне неясны, поэтому я надеюсь, что вы можете объяснить это мне. То, что я хочу сделать, это пометить плитку как стартовую плитку.
Запрос:
@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 запроса. Я знаю, что могу решить эту проблему с помощью функции извлечения соединения, но мой вопрос заключается в том, почему Hibernate извлекает обе энтиты вообще? Даже когда я аннотирую их с помощью 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();
...
Прежде чем я исправлю это, я хотел бы понять, почему это происходит.
заранее спасибо
м