Сопоставление многих со многими в Hibernate без коллекции - PullRequest
1 голос
/ 30 марта 2011

Приведенный классический пример ученика и предмета

там, где они имеют отношение ко многим,

есть ли способ сопоставить их с использованием POJO без использования коллекций?

, например

Student.java

@Entity
class Student{
  @id
  int id;
  String name;
}

Subject.java

@Entity
class Subject{
  @id
  int id;
  String desc;
}

Таблица

student (id,name)
subject (id,desc)
student_subject (student_id, subject_id) /* both foreign keys */

Как вы будете задавать вопросы по всем предметам студента? Можно ли сгенерировать эти таблицы с заданными bean-компонентами?

Заранее спасибо!

ОБНОВЛЕНИЕ: (Я просто объясню, почему я спрашиваю это?) Моя причина избегать коллекций состоит в том, что я хотел бы, чтобы мой уровень обслуживания возвращал данные, которые не привязаны к уровню сохраняемости. Возвращение объекта Student, имеющего список объектов, заставит моих клиентов уровня обслуживания предположить, что они могут получить объекты из возвращенного объекта Student (тогда они получат исключение LazyLoadException). Если я сделаю загрузку EAGER, это будет излишним, так как во многих ситуациях клиенту нужна только информация о студенте, а не все его предметы.

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Вопрос, который вам следует задать, заключается в том, можете ли вы смоделировать ваши классы так, чтобы между ними можно было установить отношения «многие ко многим» без коллекций?

Было бы идеально использовать коллекции, а затем позволить Hibernate использовать отложенную загрузку для заполнения графа объектов.

1 голос
/ 30 марта 2011

Чтобы получить все предметы, вам нужно присоединиться к столам так:

select *
from subject
    join student_subject
    on subject.id = student_subject.subject_id
where
    student_subject.student_id = ?

Можно ли сгенерировать эти таблицы с заданными bean-компонентами?

Если вы используете отображение «многие ко многим» из Hibernate, он создаст для вас запрос, если вы добавите коллекции в POJO. Без коллекции вы должны сделать это вручную.

Обратите внимание, что коллекции не будут занимать память, если:

  1. Вы используете их впервые
  2. Или вы помечаете их как «загруженные» в POJO.

По умолчанию используется отложенная загрузка, поэтому, даже если таблицы огромные, вы не заметите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...