Подтвердить что ты не робот

Когда восстанавливается идентификатор прокси-сервера Hibernate, инициализирующий прокси-сервер?

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

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 длинно аннотируется с помощью @Id.

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

4b9b3361

Ответ 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;
}

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

С уважением,