не удалось лениво инициализировать коллекцию ролей: com.pojo.Student.phonenos, сеанс или сеанс не был закрыт
-
27-10-2019 - |
Вопрос
Я изучаю отображение гибернации с помощью аннотации. Я закончил один раздел. Т.е. Я могу автоматически вставлять дочерний класс при сохранении родительской таблицы. see_that .
Но мне не удалось получить дочернюю таблицу, когда я получил главную таблицу. Также появляется ошибка
родовое словоМой код добавлен сюда, чтобы вы могли его просмотреть. Пожалуйста, пройдите через это. И дайте мне отличный совет. Student.java. (родительский класс)
родовое словоPhone.java (дочерний класс)
родовое словомой класс дао
родовое словоВыход
родовое словоЗдесь я использую однонаправленное (внешний ключ) сопоставление «один-ко-многим» (не объединенная таблица, двунаправленное).
Резюмирую свой вопрос
1) как получить дочернюю таблицу, когда мы получаем родительскую таблицу, и наоборот
2) что такое нетерпеливое и ленивое получение.
3) таблица однонаправленных, двунаправленных и соединений в случае сопоставления «один-ко-многим», какая из них является более полной.
Решение
1)
Если вы действительно хотите делать это каждый раз при извлечении любого объекта из этих классов, укажите FetchMode.EAGER
в ассоциации @OneToMany
. @ManyToOne
по умолчанию активны. Имейте в виду, что это может быть в значительной степени неэффективным, если вам нужно получить эти объекты только в определенных обстоятельствах. В этом случае вы должны сделать это так же, как и вы, но убедитесь, что сеанс, в котором был получен объект Student
, все еще открыт. Видя, что вы используете Spring, пробовали ли вы аннотировать свой DAO / Service с помощью @Transactional
, чтобы сеанс оставался активным во время выполнения метода? Или вы пробовали использовать Hibernate.execute()
, например:
родовое слово
2) Взгляните на этот вопрос: Разница между FetchType LAZY и EAGER в персистентности Java? .
3) Это зависит от того, что вам нужно. Если вам нужно перемещаться по ассоциации только одним способом, определите ее однонаправленной только таким образом. Если вам нужно и то, и другое, сделайте и то, и другое. Присоединение к таблице больше связано с дизайном базы данных. Если вы хотите иметь FK в таблице Phone
со ссылкой на код Student
, которому принадлежит телефон, или вы хотите иметь таблицу соединений с кодом Phones
для каждого кода Student
.