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

Posted

技术标签:

【中文标题】没有集合的Hibernate中的多对多映射【英文标题】:Many to Many Mapping in Hibernate without Collection 【发布时间】:2011-03-30 08:08:58 【问题描述】:

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

他们有一个多对多的关系,

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

例如

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

提前致谢!

更新:(我只是提供一个背景,为什么我会问这个?) 我避免使用集合的原因是我希望我的服务层返回与持久层无关的数据。返回具有主题列表的学生对象将使我的服务层客户端假定他们可以从返回的学生对象中获取主题(然后他们将获得 LazyLoadException)。如果我让它 EAGER 加载,那就太矫枉过正了,因为在许多情况下,客户只想要关于学生的信息,而不是得到他所有的科目。

【问题讨论】:

为什么不直接使用集合?这背后有什么原因吗? 我猜想使用集合是 ORM 中固有的,正如我在网上的许多文章中发现的那样。我避免使用集合的原因是我希望我的服务层返回不绑定到持久层的数据。 您的更新听起来像是您正在为您的学科课程中的学生对象寻找单向 @ManyToMany 映射。为此使用 Set,而不是 List 并使其延迟加载.. 【参考方案1】:

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

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

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

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

请注意,集合不会占用内存,除非:

    您是第一次使用它们 或者您在 POJO 中将它们标记为“急切地加载”。

默认是延迟加载,所以即使表很大,你也不会注意到。

【讨论】:

【参考方案2】:

您应该问的问题是,您能否对您的类进行建模,以便在它们之间建立多对多关系而无需集合?

最好使用集合,然后让 Hibernate 使用延迟加载来填充对象图。

【讨论】:

以上是关于没有集合的Hibernate中的多对多映射的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中的多对多映射

一口一口吃掉Hibernate——多对多关联映射

Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系

Hibernate多对多关系映射

Hibernate多表关系配置——多对多对关系映射

Hibernate的多对多关联关系