Понимание Ленивого Приобретения - PullRequest
1 голос
/ 05 июня 2011
@Entity
public class Bid {

    @Id
    @GeneratedValue
    @Column(name = "bid_id")
    private Long bidId;

    @Column(name = "bid_amt")
    private double bidAmount;

    @Basic(fetch = FetchType.LAZY, optional = false)
    private String person;

    @ManyToOne(targetEntity = Item.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "bid_item", referencedColumnName = "item_id", nullable = false)
    private Item item;

    public Long getBidId() {
        return bidId;
    }

    public double getBidAmount() {
        return bidAmount;
    }

    public String getPerson() {
        return person;
    }

    public Item getItem() {
        return item;
    }

    public void setBidAmount(final double bidAmount) {
        this.bidAmount = bidAmount;
    }

    public void setPerson(final String person) {
        this.person = person;
    }

    public void setItem(final Item item) {
        this.item = item;
    }

    public Bid() {
    }

    @Override
    public String toString() {
        return "Bid [bidId=" + bidId + ", bidAmount=" + bidAmount + ", person="
                + person + /* ", item=" + item + */"]";
    }

}

Контрольный пример:

@Test
    public void testBidRead() {
        final Session currentSession = sessionFactory.getCurrentSession();
        final List<Bid> bids = currentSession.createQuery("from Bid").list();
        for (final Bid bid : bids) {
            System.out.println(bid);
        }
    }

И сгенерированный SQL Hibernate:

/* 
from
    Bid */ select
        bid0_.bid_id as bid1_1_,
        bid0_.bid_amt as bid2_1_,
        bid0_.bid_item as bid4_1_,
        bid0_.person as person1_ 
    from
        Bid bid0_

Вопрос: Хотя я пометил атрибут person как lazy &&необязательно , почему это часть SQL-запроса?Означает ли это, что Hibernate не получает лениво?То же самое в случае с Item.

Как лениво извлекать атрибуты?

Ответы [ 3 ]

2 голосов
/ 05 июня 2011

Person - это одиночное (строковое) свойство

Выборка, в то время как другие выборки (для не ленивых выборок, таких как bidId и bidAmount) выполняются для одного и того же объекта, являются здравым смыслом

Поскольку запрос должен быть выполнен в любом случае, и транспортировка varchar (или чего-либо еще) вместе с bidId и bidAmount не требует больших затрат

И он загружается в элемент id (не сам элемент), чтобы сам элемент мог быть загружен при вызове getItem() без другого запроса для получения идентификатора (кэширование идентификатора между конструкцией и вызовом getItem())

2 голосов
/ 05 июня 2011

Чтобы сделать атрибут person (в отличие от ассоциации) действительно ленивым, вы должны байт-кодировать ваши классы во время сборки. Справочная документация содержит информацию о том, как это сделать.

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#performance-fetching-lazyproperties

1 голос
/ 05 июня 2011

Кажется, что hibernate загружает только значения внешнего ключа, а не весь объект Person или Item.Что с ним не так?

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