Когда при получении идентификатора прокси Hibernate инициализируется прокси? - PullRequest
12 голосов
/ 10 февраля 2010

В Hibernate, когда вы получаете Entity через нагрузку, если вы получаете доступ к идентификатору этого Entity, он не инициализирует прокси:

Property myProp = (Property) session.load(Property.class, myId);
myProp.getId(); // Doesn't load the proxy
myProp.getDescription();  // Loads the proxy from the database hit

Однако мне неясно, каковы правила загрузки прокси ассоциаций. У меня сложилось впечатление, что при извлечении сущности с помощью HQL-запроса или критериев применяются те же правила.

Каждый Property в моем коде имеет Company. Company объявляется так:

@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "company_id", nullable=false)
private Company company;

Однако в моем коде в настоящее время я получаю N + 1 выбор при переборе Properties, потому что Company загружается при вызове Company.getId().

И в объекте Company, и в Property поле id представляет собой Long, помеченное @Id.

Есть ли еще какие-то соображения, которые я упускаю, чтобы предотвратить загрузку Company сущности?

1 Ответ

10 голосов
/ 10 февраля 2010

Он не работает должным образом, просто из-за вы должны использовать доступ к свойству вместо доступа к полю.

Вместо

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="COMPANY_ID", nullable=false)
private Company company;

Используйте

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="COMPANY_ID", nullable=false)
public Company getCompany() {
    return this.company;
}

Следит за тем, чтобы вы не могли одновременно использовать доступ к собственности и доступ к полю. Так что вы должны выбрать один подход .

С уважением,

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