В В спящем режиме, когда Вы получаете Объект через загрузку при доступе к идентификационному средству доступа того Объекта, оно не инициализирует прокси:
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
объект?
Это не работает должным образом просто потому, что вам нужно использовать доступ к свойству вместо доступа к полю.
Вместо
@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;
}
Позаботьтесь о том, чтобы вы не могли одновременно использовать доступ к свойству и доступ к полю. Итак, вы должны выбрать один подход .
с уважением,