Java Persistence с Hibernate Book упоминает об этом в «13.1.3 Понимание прокси»:
Пока вы обращаетесь только к свойству идентификатора базы данных, нет
инициализация прокси необходима. (Обратите внимание, что это не так
если вы сопоставите свойство идентификатора с прямым доступом к полю; зимовать
тогда даже не знает, что метод getId () существует. Если ты это называешь,
прокси должен быть инициализирован.)
Однако, основываясь на ответе @xmedeko на этой странице, я разработал хак, чтобы избежать инициализации прокси даже при использовании стратегии прямого доступа к полю . Просто измените метод getId()
, как показано ниже.
Вместо:
public long getId() { return id; }
Использование:
public final long getId() {
if (this instanceof HibernateProxy) {
return (long)((HibernateProxy)this).getHibernateLazyInitializer().getIdentifier();
}
else { return id; }
}
Идея в том, чтобы пометить метод getId()
как final
, чтобы прокси не могли его переопределить. Затем вызов метода не может запустить какой-либо прокси-код и, следовательно, не может инициализировать прокси. Сам метод проверяет, является ли его экземпляр прокси, и в этом случае возвращает идентификатор прокси. Если экземпляр является реальным объектом, он возвращает идентификатор.