Hibernate之关联映射(一对多和多对一映射,多对多映射)

2017-03-20 19:24:12来源:作者:人点击

~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训。)~~~

1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射:

1.1:一对多和多对一映射,举例说明:

学生和老师:

一个老师可以教多个学生 【一对多映射】

多个学生可以被一个老师教【多对一映射】

部门与员工:

一个部门有多个员工【一对多映射】

多个员工属于一个部门【多对一映射】

1.2:多对多,举例说明:

项目和开发员工:【双向一对多即多对多映射】

一个项目有多个开发人员【一对多】

一个开发人员参与多个项目【一对多】


2:理清以下思路就可以进行简单的开发了:

2.1:首先导入hibernate框架所需要的包哦~~~

2.2:由于是在hibernate.cfg.xml配置里面自动生成数据库和表,所以不用手动创建了

2.3:进入正题,开发创建实体类;下面是两个实体类的关键点;

Dept.java:

注意private Set<Employee> emps;//部门对应多个员工,即一对多的关系

Employee.java:

private Dept dept;//员工和部门的关系

 1 package com.bie.po; 2  3 import java.util.HashSet; 4 import java.util.Set; 5  6 /**  7 * @author BieHongLi  8 * @version 创建时间:2017年3月20日 上午9:45:21  9 * 部门的实体类10 *  关键点,是通过部门实体类维护到员工的实体类11 */12 public class Dept {13 14  private int deptId;//部门编号15  private String deptName;//部门名称16  17  private Set<Employee> emps;//部门对应多个员工,即一对多的关系18  //private Set<Employee> emps = new HashSet<>();//方便赋值,这里可以直接创建实例化19  20  21  public int getDeptId() {22 return deptId;23  }24  public void setDeptId(int deptId) {25 this.deptId = deptId;26  }27  public String getDeptName() {28 return deptName;29  }30  public void setDeptName(String deptName) {31 this.deptName = deptName;32  }33  public Set<Employee> getEmps() {34 return emps;35  }36  public void setEmps(Set<Employee> emps) {37 this.emps = emps;38  }39  40  41 }
View Code
 1 package com.bie.po; 2 /**  3 * @author BieHongLi  4 * @version 创建时间:2017年3月20日 上午9:46:45  5 * 员工的实体类 6 */ 7 public class Employee { 8  9  private int empId;//员工的编号10  private String empName;//员工的名称11  private double salary;//员工的薪资12  13  private Dept dept;//员工和部门的关系14  15  public int getEmpId() {16 return empId;17  }18  public void setEmpId(int empId) {19 this.empId = empId;20  }21  public String getEmpName() {22 return empName;23  }24  public void setEmpName(String empName) {25 this.empName = empName;26  }27  public double getSalary() {28 return salary;29  }30  public void setSalary(double salary) {31 this.salary = salary;32  }33  public Dept getDept() {34 return dept;35  }36  public void setDept(Dept dept) {37 this.dept = dept;38  }39  40  41 }
View Code

2.4:创建好实体类就可以进行创建hibernate的映射文件了,如Dept.hbm.xml和Employee.hbm.xml映射文件;

部门表进行映射的时候:

需要注意使用set集合进行映射的注意点

员工表进行映射的时候:

需要注意<many-to-one name="dept" column="deptId" class="Dept"></many-to-one>

 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC  3  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 56 <!-- 如果hibernate-mapping的package属性直接初始化了,下面就可以直接引用了 -->  7 <hibernate-mapping package="com.bie.po"> 8  <class name="Dept" table="dept"> 9 <!-- 第一首先写主键映射 -->10 <id name="deptId" column="deptId">11 <generator class="native"></generator>12 </id>13 <!-- 第二写非主键映射 -->14 <property name="deptName" column="deptName" length="20" type="string"></property>15  16 <!-- 17 第三写其他映射,比如这里的set集合映射, 18 -->19 <!-- 20 一对多关联映射配置(通过部门管理到员工)21 Dept映射关键点22  (1)指定映射的集合属性:""emps;23  (2)集合属性对应的集合表:"employee";24  (3)集合表的外键字段:employee.empId25  (4)集合元素的类型26  -->27 <!-- name指定了映射的集合的属性,即集合实例化的emps;table指定了集合属性对应的集合表 -->28 <set name="emps" table="employee">29 <!--column指定了集合表的外键  -->30 <key column="deptId"></key>31 <!-- class由于上面已经写了包名,这里直接使用即可 -->32 <one-to-many class="Employee"/>33 </set>34  </class>35 </hibernate-mapping>36  37  38  
 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC  3  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <!-- 这里指定package,里面就可以直接引用了 --> 6 <hibernate-mapping package="com.bie.po"> 7  <class name="Employee" table="employee"> 8 <!-- 1:主键映射 --> 9 <id name="empId" column="empId">10 <generator class="native"></generator>11 </id>12 13 <!-- 2:非主键映射 -->14 <property name="empName" column="empName" length="20" type="string"></property>15 <property name="salary" column="salary" type="double"></property>16 17 <!--18  多对一的映射配置;Employee映射的关键点19  (1)映射的部门属性:dept20  (2)映射的部门对新,对应的外键字段:deptId21  (3)部门的类型:Dept22  -->23  <many-to-one name="dept" column="deptId" class="Dept"></many-to-one>24  </class>25 26 </hibernate-mapping> 27  28  

2.5:配置好映射文件,就可以配置hibernate的配置文件了,hibernate.cfg.xml;

注意:

第二部分其他配置的时候注意显示sql语句和方言还有自动创建数据表这些细节问题

第三部分加载映射文件的写法也需要注意

 1 <!DOCTYPE hibernate-configuration PUBLIC 2  "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 3  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 45 <hibernate-configuration> 6  <session-factory> 7 <!-- 第一部分:连接数据库的操作,加载驱动,连接数据库的url和账号密码 --> 8 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 9 <property name="hibernate.connection.url">jdbc:mysql:///test</property>10 <property name="hibernate.connection.username">root</property>11 <property name="hibernate.connection.password">123456</property>12  13 <!-- 第二部分:其他相关配置 -->14 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>15 <property name="hibernate.show_sql">true</property>16 <property name="hibernate.format_sql">true</property>17 <property name="hibernate.hbm2ddl.auto">update</property>18 <!-- <property name="hibernate.hbm2ddl.auto">create</property> -->19 20 <!-- 第三部分:加载映射文件 -->21 <mapping resource="com/bie/po/Dept.hbm.xml"/>22 <mapping resource="com/bie/po/Employee.hbm.xml"/>23  </session-factory>24 </hibernate-configuration>

2.6:最后就可以使用junit进行测试了,如下所示:

 1 package com.bie.test; 2  3 import java.util.HashSet; 4 import java.util.Set; 5  6 import org.hibernate.Session; 7 import org.hibernate.SessionFactory; 8 import org.hibernate.cfg.Configuration; 9 import org.junit.Test;10 11 import com.bie.po.Dept;12 import com.bie.po.Employee;13 14 /** 15 * @author BieHongLi 16 * @version 创建时间:2017年3月20日 上午10:29:38 17 * 18 */19 public class OneManyTest {20 21  //初始化静态的session工厂22  private static SessionFactory sf = null;23  static{24 //这里使用简写的方法,首先加载默认的hibernate.cfg.xml,然后是创建session工厂25 sf = new Configuration().configure().buildSessionFactory();26  }27  28  @Test29  public void test(){30 //创建session,import org.hibernate.Session;31 Session session = sf.openSession();32 //session开始事务33 session.beginTransaction();34 35 //1:关键点,部门对象的初始化,创建一个部门36 Dept dept = new Dept();37 dept.setDeptName("开发部");38 39 //2:关键点,员工的初始化,创建两个人对象40 Employee emp1 = new Employee();41 emp1.setEmpName("张三");42 Employee emp2 = new Employee();43 emp2.setEmpName("李四");44 45 //3:然后将创建的人添加到set集合中46 Set<Employee> set = new HashSet<>();47 set.add(emp1);48 set.add(emp2);49 50 //4:再将set集合中保存的人保存到部门里面51 dept.setEmps(set);52 53 //5:最后保存员工对象,部门54 session.save(emp1);55 session.save(emp2);56 session.save(dept);57 58 //提交事务,省去了事务new实例化了59 session.getTransaction().commit();60 //关闭session61 session.close();62  }63  64  @Test65  public void test2(){66 //创建session,import org.hibernate.Session;67 Session session = sf.openSession();68 //session开始事务69 session.beginTransaction();70 71 //1:关键点,部门对象的初始化,创建一个部门72 Dept dept = new Dept();73 dept.setDeptName("开发部");74 75 //2:关键点,员工的初始化,创建两个人对象76 Employee emp1 = new Employee();77 emp1.setEmpName("张三");78 Employee emp2 = new Employee();79 emp2.setEmpName("李四");80 81 //3:再将set集合中保存的人保存到部门里面82 dept.getEmps().add(emp1);83 dept.getEmps().add(emp2);84 85 //5:最后保存员工对象,部门86 session.save(emp1);87 session.save(emp2);88 session.save(dept);89 90 //提交事务,省去了事务new实例化了91 session.getTransaction().commit();92 //关闭session93 session.close();94  }95  96 }

测试结果如下所示(由于set集合在实体类里面初始化和不初始化出现下面两种情况,所以需要注意两种测试测试的方法):

只有学习才能使我快乐~~~,加油~~~

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台