Когда делает получение идентификатора Быть в спящем режиме прокси, инициализируют прокси?

В В спящем режиме, когда Вы получаете Объект через загрузку при доступе к идентификационному средству доступа того Объекта, оно не инициализирует прокси:

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 в моем коде имеет a 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.

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

13
задан jbarz 9 February 2010 в 23:20
поделиться

1 ответ

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

Вместо

@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;
}

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

с уважением,

11
ответ дан 2 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: