Как работают аннотации отношений гибернации (@OneToOne, @OneToMany и т. д.)

Допустим, есть объект Student, который имеет отношение «один ко многим» с объектом Subject, который загружается лениво. Аннотация @OneToMany используется для указания отношения. Я хотел бы понять внутреннюю работу спящего режима о том, как обрабатывается эта аннотация.


person java_geek    schedule 09.12.2013    source источник
comment
Его открытый исходный код, но мне нужно знать, какой класс искать. Есть ли у него процессор аннотаций, который обрабатывает это? Допустим, объект студента заполнен, но предметы не из-за ленивой загрузки; когда я вызываю student.getSubjects(), что на самом деле происходит. Вот что я хочу знать   -  person java_geek    schedule 09.12.2013
comment
Аннотация — это всего лишь маркер, настоящая магия творится с переплетением, то есть манипулированием байт-кодом — при загрузке классы эффективно переписываются для создания таких вещей, как отношения и отложенная загрузка.   -  person fvu    schedule 09.12.2013
comment
@fvu: я хотел бы узнать некоторые подробности этого процесса. Вот почему я задал вопрос. Есть ли какая-нибудь ссылка, которая может мне помочь?   -  person java_geek    schedule 09.12.2013


Ответы (1)


При создании экземпляра Student из данных, прочитанных в базе данных, Hibernate инициализирует коллекцию subjects экземпляром своей собственной реализации Collection (которая хорошо называется PersistentCollection).

Эта PersistentCollection изначально не инициализирована и не содержит никаких данных. При первом вызове любого метода этой коллекции выполняется SQL-запрос для загрузки всех предметов учащегося, а затем предметы кэшируются внутри коллекции для всех последующих вызовов методов.

person JB Nizet    schedule 09.12.2013
comment
У меня есть еще один вопрос. Можете ли вы сообщить мне, как hibernate узнает во время выполнения, что коллекцию нужно загружать лениво? Манипулирует ли он байт-кодом во время компиляции или аннотация доступна во время выполнения? - person java_geek; 09.12.2013
comment
Да, аннотация доступна во время выполнения. Когда создается фабрика сеансов, Hibernate анализирует все классы сущностей. - person JB Nizet; 09.12.2013
comment
Спасибо за ответы - person java_geek; 10.12.2013