Hibernate中的多对多映射没有集合

时间:2011-03-30 08:08:59

标签: java sql database hibernate orm

给出了学生和主题的经典例子

他们有多对多的关系,

有没有办法使用POJO来映射它们而不使用集合?

e.g。

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生成这些表?

提前致谢!

更新:(我只是给出一个背景为什么我问这个?) 我避免收集的原因是我希望我的服务层返回与持久层无关的数据。返回具有Subjects列表的Student对象将使我的服务层客户端假设他们可以从返回的student对象中获取主题(然后他们将获得LazyLoadException)。如果我加载EAGER,那就太过分了,因为在很多情况下,客户只会喜欢关于学生的信息而不会得到他所有的科目。

2 个答案:

答案 0 :(得分:1)

要获得所有科目,您需要像这样加入表格:

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

是否可以使用给定的bean生成这些表?

如果您使用Hibernate的多对多映射,如果您在POJO中添加集合,它将为您创建查询。没有集合,您必须手动完成。

请注意,除非:

,否则集合不会占用内存
  1. 您是第一次使用它们
  2. 或者你在POJO中将它们标记为“急切地加载”。
  3. 默认是延迟加载,因此即使表格很大,您也不会注意到。

答案 1 :(得分:1)

您应该问的问题是,您是否可以为您的类建模,以便在没有集合的情况下在它们之间建立多对多的关系?

使用集合然后让Hibernate使用延迟加载来填充对象图是理想的。