Понимание Hibernate Fetch - PullRequest
       3

Понимание Hibernate Fetch

0 голосов
/ 21 января 2011

Я знаю, что 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();
  ...

Прежде чем я исправлю это, я хотел бы понять, почему это происходит. заранее спасибо м

Ответы [ 2 ]

5 голосов
/ 21 января 2011

Причина, по которой это происходит, в том, что они помечены как обнуляемые.Когда используется прокси, Hibernate все еще должен знать разницу между теми, которые относятся к прокси, и теми, которые на самом деле просто равны нулю.

Когда связь является коллекцией, она может дать вам пустую коллекцию, а затем проверить позже.Но когда он равен OneToOne, он все равно должен заглянуть в БД, чтобы выяснить, должно ли поле быть пустым, или оно может быть прокси и загружено с отложенным доступом.Так как он должен выглядеть в любом случае, он просто загружает его.

Если вы отметите и fetch=FetchType.LAZY, и optional=false, вы можете получить ленивую выборку на один.Конечно, если фактический столбец обнуляем, вы SOL.

0 голосов
/ 21 января 2011

Я нашел свой ответ ей: http://community.jboss.org/wiki/HibernateFAQ-AdvancedProblems#Hibernate_ignores_my_outerjointrue_or_fetchjoin_setting_and_fetches_an_association_lazily_using_n1_selects

Это также хороший вопрос, который я пропустил ранее, который очень хорошо его объясняет: JPA eager fetch не присоединяется

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...