双边的多对一、一对多关系

双边关系是最常见的配置。在多方有一方的引用,一方也有多方的引用。双边关系能够很方便的查询数据。下面以一个班级与学生的双边关系来深入学习。

班级(clazz类)与学生(student类)为一对多关系。班级中有学生属性,学生中有班级属性,二者是双边的关系。

具体代码如下:

Clazz类中有一个id主键和一个name属性,另外还有一个List<Student>类型的集合属性,代表该班级内的学生。班级与学生的关系是一对多关系,这里使用了@OneToMany配置,并用mappedBy属性配置与该List<Student>属性对应的是Student类中的clazz属性。

Clazz.java

package com.lmb.hibernate.bean;import java.util.ArrayList;
import java.util.List;import javax.persistence.*;@Entity
@Table(name="tb_clazz")
public class Clazz {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;@OneToMany(mappedBy = "clazz")private List<Student> students = new ArrayList<Student>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;}
}

双边关系中,控制权一般交给多方,因此这里的@OneToMany没有哦诶之数据库的外键列,而只配置了一个mappedBy属性,值为clazz,告诉hibernate,配置信息要到Student类的clazz属性中找。

Student类中有一个id主键以及name姓名、sex性别两个普通属性,还有一个Clazz类型的属性clazz,代表所在的班级。该属性与Clazz中的List<Student>集合属性是对应的。从逻辑上来讲,某student的clazz属性为某clazz,该clazz的List<Student>中必定还有改student。配置了mappedBy后,hibernate能自动维护这种关系。

Student与Clazz是一对多的关系,一对多使用@ManyToOne配置,另外用@JoinColumn配置关联的列名。这里用tb_student表的class_id列于tb_class的id主键列连接。这里同时配置了级联保存类型为PERSIST,创建student时,会自动将clazz也写进数据库。

student.java

package com.lmb.hibernate.bean;import javax.persistence.*;@Entity
@Table(name="tb_student")
public class Student {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;private String sex;@ManyToOne(cascade = {CascadeType.PERSIST},fetch = FetchType.EAGER)@JoinColumn(name="class_id")private Clazz clazz;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Clazz getClazz() {return clazz;}public void setClazz(Clazz clazz) {this.clazz = clazz;}
}

注意:@JoinColumn配置了外键列,这里把控制权交给了多方,也可以交给一方。当一方控制时,一方的配置同单边的一对多关系配置完全相同。

将Clazz与Studet实体类配置到hibernate配置文件中去。

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration><session-factory><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=UTF-8</property><property name="connection.username">lmb</property><property name="connection.password">lmb</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><mapping class="com.lmb.hibernate.bean.Person" /><mapping class="com.lmb.hibernate.bean.Email" /><mapping class="com.lmb.hibernate.bean.Clazz" /><mapping class="com.lmb.hibernate.bean.Student" /></session-factory></hibernate-configuration>

双边关系使用起来比较方便,查询或者使用时可以从任意一方访问到另一方。不过双边关系也不是任何时候都适用的。如果多方的数据量比较大,比如几千条几万条,设置一方的一对多映射可能是个隐患。比如,不小心执行了getStudent().size(),程序会加载这几千条几万条的子数据,造成巨大的IO开支,影响到程序的运行效率。这种情况下设置双边关系是不明智的,应该取消一方的一对多映射,不要使用getStudent().size()来统计子数据,而改用执行select count(s) from Student s查询语句的方式统计个数。

【HibernateHibernate实体关系映射——双边的多对一、一对多关系相关推荐

  1. 【Hibernate】Hibernate实体关系映射——双边的多对多关系

    //刘梦冰发表于2015-6-19 http://blog.csdn.net/lmb55/article/details/46565581讲述了单边的多对多关系,本文在该例的基础上近一步学习双边的多对 ...

  2. 【Hibernate】hibernate实体关系映射——单边的多对多关系

    //刘梦冰发表于2015-6-19 单边的多对多关系 多对一.一对多的关系只需要两个表即可,使用子表的外键与主表的主键连接就能存储主从关系.而对多对多的关系至少需要三个表,其中两个表保存两个实体类,另 ...

  3. 【Hibernate】Hibernate实体关系映射——单边的多对一关系

    单边的多对一关系 单边的多对一关系与单边的一对多关系刚好相反,多方有一方的引用,一方没有多方的引用,但是他们的数据表间的关系是一样的.例如:论文与论文类别: 具体实现如下: Type实体类的java注 ...

  4. 【Hibernate】Hibernate实体关系映射——双边的一对一关系

    凡是配置实体间关系的标签,例如:@ManyToOne.@OneToMany.@ManyToMany.@OneToOne等,都可以配置mappedBy属性.mappedBy表示该属性是反向属性,与另一边 ...

  5. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!...

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  6. netsuite 数据集成_Java中带有NetSuite数据实体的对象关系映射(ORM)

    netsuite 数据集成 对象关系映射(ORM)技术使使用关系数据源更加容易,并且可以将逻辑业务模型与物理存储模型联系在一起. 遵循本教程,将NetSuite数据的连接集成到基于Java的ORM框架 ...

  7. Java中带有NetSuite数据实体的对象关系映射(ORM)

    对象关系映射(ORM)技术使使用关系数据源更容易,并且可以将逻辑业务模型与物理存储模型联系在一起. 遵循本教程,将与NetSuite数据的连接集成到基于Java的ORM框架Hibernate中. 您可 ...

  8. Hibernate关系映射

    Hibernate关系映射 Hibernate关系映射其实就是将关系模型中实体之间的三种关系--多对一(一对多).一对一.多对多映射成对象模型--Java这样的面向对象语言中相应的属性之间的关系. 多 ...

  9. Hibernate旅程(五)Hibernate映射--基本类映射和对象关系映射

    回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表.实体间存在三种关系,一对一,一对多(或者说多对一),多对多.而如今 ...

最新文章

  1. OSCache-JSP页面缓存(2)
  2. 《零基础看得懂的C++入门教程 》——(8)搞定二维数组与循环嵌套
  3. (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节2:I/O控制器
  4. android 时间差 秒_Android 根据两个时间戳计算时间差(亲测可用)
  5. LINUX关于休眠、待机和睡眠的问题
  6. BZOJ:1001狼抓兔子
  7. html5怎么设置黑色背景及亮度,网页背景怎么设置为纯黑色css样式
  8. raspberry pi设置静态IP地址
  9. 电脑笑脸蓝屏问题 也许你可以尝试一下这个
  10. 你的微博也被盗赞?试试HSTS强制HTTPS加密 1
  11. 桌面程序聊天窗口的自动输入内容及自动发送
  12. Java自定义注解身份证校验
  13. 稳定婚配问题的所有可能解
  14. GitBook 告别文档共享烦恼
  15. 解锁AI技能:深度学习利用OCT图像诊断眼内视网膜疾病
  16. 关于解决错误apt --fix-broken install
  17. Mac下通过镜像下载Android源代码
  18. 终于拿下淘宝了。淘宝抓取,淘宝爬虫。taobao spider
  19. 《软件需求分析 复习 的参考资料》
  20. thinkcenter电脑重置

热门文章

  1. 大亚DP607超级密码,破解方法
  2. Rose与PowerDesigner:两款建模工具对比分析比较[转]
  3. Linux Shell常用技巧(十一)
  4. OutOfMemoryError dump memory
  5. Hotspot垃圾回收
  6. Chrome 静默打印及其它启动参数
  7. 【数据结构】绪论部分
  8. 使用cocoapods
  9. CSS3幻灯片制作心得
  10. debian/deepin 15.3 15.4安装jdk 1.7 (或jdk 7),配置默认环境