Допустим, есть объект Student, который имеет отношение «один ко многим» с объектом Subject, который загружается лениво. Аннотация @OneToMany используется для указания отношения. Я хотел бы понять внутреннюю работу спящего режима о том, как обрабатывается эта аннотация.
Как работают аннотации отношений гибернации (@OneToOne, @OneToMany и т. д.)
comment
Он называется открытым исходным кодом по известной вам причине :)
- person fvu   schedule 09.12.2013
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
У меня есть еще один вопрос. Можете ли вы сообщить мне, как hibernate узнает во время выполнения, что коллекцию нужно загружать лениво? Манипулирует ли он байт-кодом во время компиляции или аннотация доступна во время выполнения?
- person java_geek; 09.12.2013
Да, аннотация доступна во время выполнения. Когда создается фабрика сеансов, Hibernate анализирует все классы сущностей.
- person JB Nizet; 09.12.2013
Спасибо за ответы
- person java_geek; 10.12.2013