пример использования из книги "Java Постоянство с Hibernate, 2nd Edition" - PullRequest
1 голос
/ 19 июня 2020

Я читаю книгу «Java Постоянство с Hibernate, 2nd Edition». Это пример товаров, проданных участникам торгов, таким как ebay. На странице 400 автор говорит:

Запрос select i from item i left join fetch i.bids b where b.amount > 20 недействителен. Вы не можете сказать: «Загрузите экземпляры Item и инициализируйте их коллекции ставок, но только с экземплярами Bid, у которых есть определенное количество».

Я не уверен, что понимаю. На мой взгляд, он действителен, но он будет отображать только те элементы, для которых есть ставка, сумма которой больше 20. В этом случае он будет отображать внутреннее соединение с этим условием

Кроме того, следующий запрос select i from item i left join fetch i.bids b on b.amount > 20 действительно?

1 Ответ

0 голосов
/ 19 июня 2020

select i from item i left join fetch i.bids b where b.amount > 20, поскольку HQL недопустим. Поскольку результаты HQL используются для возврата объектов Item , вы не можете указать спящему режиму создать объекты Item, но при его создании не заполняйте его all Bid s но заполнять только Bid s с суммой больше 20.

Рассмотрим следующий класс

public class Item {
    String name;
    Collection<Bid> bids;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Collection<Bid> getBids() {
        return bids;
    }

    public void setBids(Collection<Bid> bids) {
        this.bids = bids;
    }
}

Обновление: (Давайте рассмотрим пример, чтобы увидеть, что бы произошло если спящий режим разрешил этот запрос)

Обновление: (Давайте рассмотрим пример, если спящий режим разрешил этот запрос)

Основные проблемы, если спящий режим позволил этому случиться:

  1. Первая проблема, это будет концептуально неправильно, потому что любая служба, использующая объект item1 java, который был возвращенный из репо не знает item.getBids содержит только ставку с суммой> 20
  2. Hibernate сохраняет только одну ссылку на объект для представления сущности базы данных в сеансе ( Гарантия повторного чтения, грязная проверка и т. д. c). Итак, если вы сделаете еще один Select i from Item i where i.itemId = 1 , у спящего режима возникнет проблема, потому что теперь у него должно быть два объекта java для представления элемента 1 в этом сеансе (один со ставками, где сумма> 20, а другой со всеми ставками элемента1)

Надеюсь, это ясно объясняет, почему запрос не может быть разрешен

...