2015-02-13 1 views
6

Я иду из eclipselink и пытаюсь работать самостоятельно через Hibernate.Как загрузить фактическую ассоциацию сущностей Hibernate, а не прокси LAZY

Предположим, у нас есть класс Car и класс Wheel. Класс Car имеет n колес. Оба объекта связаны с двунаправленной ассоциацией. Что еще более важно на Wheel стороны у меня есть Car ссылки:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "car_id") 
private Car car; 

плюс поглотитель.

Теперь я хочу получить колесо, используя его идентификатор. Из моего EntityManager (не спящий режим Session). Я инициализировать EntityManager так:

EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
EntityManager em = emf.createEntityManager(); 

Следующим шагом является извлечение колеса, как это:

Wheel wheel = em.find(Wheel.class, 1); 

Колесо вернуть разыскиваемого класс и его штраф. Теперь я хочу знать, какой автомобиль является родителем колеса что-то вроде:

Car car = wheel.getCar(); 

С EclipseLink, реальная машина была бы загружена. Вместо hibernate вместо этого загружается класс прокси.

Единственное решение, которое я разработал до сих пор, это установить FetchType.EAGER или напрямую получить соединение. Я понял, что оператор SQL в Hibernate все еще выполняется, но никакого реального объекта не доставлено. Также после

Hibernate.initalize(car) 

Я не могу получить автомобиль.

Есть ли способ вернуть ожидаемый объект без формирования запроса или с нетерпением?

+1

Да. Когда колесо будет восстановлено, я верну правильный объект из базы данных.На следующем шаге я делаю wheel.getCar() ;. В eclipselink автомобиль загружается мгновенно (выполняется запрос), и я получаю реальный объект Car. В спящем режиме кажется, что я возвращаю только прокси-объект (даже если запрос выполняется, как я вижу в журнале). Вопрос заключается в том, как вернуть реальный объект после того, как он не сделает реальность или не начнет выборку в первую очередь. Надеюсь это поможет. – whereismydipp

+0

Потому что мне нужен реальный объект автомобиля вместо прокси. Я проверил объект в отладчике ... его определенно прокси :). – whereismydipp

+0

Зачем вам нужен настоящий объект? Что вы хотите сделать, это требует объекта, а не прокси? – rghome

ответ

6

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

Если прокси-объект не работает (он возвращает нулевые значения), возможно, некоторые из ваших полей или сеттеров или получателей установлены в final. Сначала проверьте это.

4

Вы должны использовать Hibernate конкретные LazyToOneOption.NO_PROXY аннотацию:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "car_id") 
@LazyToOne(LazyToOneOption.NO_PROXY) 
private Car car; 

Это будет инструктировать Hibernate, чтобы загрузить реальный объект, вместо того чтобы дать вам прокси:

ленивым, вернуть реальный объект загружается при запросе ссылки (для этой опции обязательным является расширение байтового кода, возврат к PROXY , если класс не расширен). Этот вариант следует избегать, если вы не можете предоставить нам e прокси

Для активации этой опции вам потребуется использовать инструментарий Bytecode.

+0

Не могу проверить это на данный момент. Будет ли это загружать мне реальный объект по требованию во время выполнения, когда я вызываю wheel.getCar(); – whereismydipp

+0

Другой ответ был лучше. По-прежнему даст вам преимущество. cheers – whereismydipp

+0

Спасибо. В самом деле, вы не должны слишком беспокоиться об этом. –

Смежные вопросы