多对一  Employee-Department

对于 员工 和 部门 两个对象,从员工的角度来看,就是多对一的一个关系--->多个员工对应一个部门

表设计:

  部门表:department,id主键

  员工表:employee,id主键,depart_id作为外键,与部门表的主键对应

对象模型设计:

  部门:

  1. package org.zln.hibernate.domain;
  2.  
  3. /**
  4. * 部门Domain对象
  5. * Created by sherry on 000018/6/18 21:38.
  6. */
  7. public class Department {
  8. private int id;
  9. private String name;
  10.  
  11. @Override
  12. public String toString() {
  13. return "Department{" +
  14. "id=" + id +
  15. ", name='" + name + '\'' +
  16. '}';
  17. }
  18.  
  19. public int getId() {
  20. return id;
  21. }
  22.  
  23. public void setId(int id) {
  24. this.id = id;
  25. }
  26.  
  27. public String getName() {
  28. return name;
  29. }
  30.  
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34.  
  35. }

  员工:

  1. package org.zln.hibernate.domain;
  2.  
  3. /**
  4. * 员工Domain对象
  5. * Created by sherry on 000018/6/18 21:39.
  6. */
  7. public class Employee {
  8. private int id;
  9. private String name;
  10. /*employee隶属于一个department*/
  11. private Department department;
  12.  
  13. @Override
  14. public String toString() {
  15. return "Employee{" +
  16. "id=" + id +
  17. ", name='" + name + '\'' +
  18. ", department=" + department +
  19. '}';
  20. }
  21.  
  22. public int getId() {
  23. return id;
  24. }
  25.  
  26. public void setId(int id) {
  27. this.id = id;
  28. }
  29.  
  30. public String getName() {
  31. return name;
  32. }
  33.  
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37.  
  38. public Department getDepartment() {
  39. return department;
  40. }
  41.  
  42. public void setDepartment(Department department) {
  43. this.department = department;
  44. }
  45. }

XML映射文件配置

  员工:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="org.zln.hibernate.domain">
  6.  
  7. <class name="Employee" table="employee">
  8. <!--单字段主键-->
  9. <id name="id" column="id">
  10. <generator class="native"/>
  11. </id>
  12. <!--普通字段-->
  13. <property name="name" column="name"/>
  14. <!--多对一字段--><!--默认查找员工表中的department_id==部门表中的主键id的部门信息,也可以手动指定 property-ref-->
  15. <many-to-one name="department" column="department_id"/>
  16. </class>
  17.  
  18. </hibernate-mapping>

  部门:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="org.zln.hibernate.domain">
  6.  
  7. <class name="Department" table="department">
  8. <id name="id" column="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name" column="name"/>
  12.  
  13. </class>
  14.  
  15. </hibernate-mapping>

说明:部门的映射文件没有什么不同,但是在员工的映射文件中,映射domain对象中的department对象的,是department_id字段,Hibernate会查询employee表中的department_id,以此为条件,

  再去查询department表中的记录,department_id对应department表中的id(默认情况外键对应主键嘛)。然后将从department表中的记录填充到employee对象中的department成员变量。

Dao:

  1. /**
  2. * 添加员工及其部门
  3. * @param department
  4. * @param employee
  5. */
  6. public void addEmployee(Department department,Employee employee){
  7. Session session = null;
  8. Transaction transaction = null;
  9. try {
  10. session = HibernateUtils.getSession();
  11. transaction = session.beginTransaction();
  12.  
  13. employee.setDepartment(department);
  14. session.save(department);
  15. session.save(employee);
  16.  
  17. transaction.commit();
  18.  
  19. }finally {
  20. if (session != null){
  21. session.close();
  22. }
  23. }
  24. }

上段代码,往数据库的员工表与部门表同时插入了一条记录,通过  employee.setDepartment(department);    将部门记录管理到了员工记录中

先插部门,会生成一个id作为员工表的外键,在插员工,此时员工信息+外键,都会插入到员工表中。如果先插入员工,那么此时员工表的外键是空的,当插入部门后,部门主键生成,员工的外键才有值,此时Hibernate在提交前还会执行一条update语句。从结果上看是一样的,但是多执行了一条。所以最好还是先执行部门的插入操作。

  1. public void addEmployee(Employee employee){
  2. Session session = null;
  3. Transaction transaction = null;
  4. try {
  5. session = HibernateUtils.getSession();
  6. transaction = session.beginTransaction();
  7.  
  8. /*通过department_id查询department,将部门与员工关联起来*/
  9. employee.setDepartment(departmentDao.getDepartment(employee.getDepartment()));
  10. session.save(employee);
  11.  
  12. transaction.commit();
  13. }finally {
  14. if (session != null){
  15. session.close();
  16. }
  17. }
  18. }

上段代码,员工想要关联的部门信息已经在数据库中了,不需要重新插入,那么怎么关联呢?答案就是在插入员工信息前,先通过部门的查询条件从数据库中查询到部门信息,将部门信息设置给员工,然后再保存员工。此时数据库中的员工记录也和部门信息有了关联。

  1. public Employee getEmployee(Employee employee){
  2. Session session = null;
  3. Employee employee1 = null;
  4. try {
  5. session = HibernateUtils.getSession();
  6. employee1 = (Employee) session.get(Employee.class,employee.getId());
  7. System.out.println(employee1);//不知道为什么,不先使用对象的话,session关闭后在方法体外就无法使用了。这里的懒加载干嘛了?
  8. }finally {
  9. if (session != null){
  10. session.close();
  11. }
  12. }
  13. return employee1;
  14.  
  15. }

上段代码,查询条件就只有员工的id,但是通过映射文件,其对应的部门信息也会被填充到员工信息中

Hibernate关联映射之_多对一的更多相关文章

  1. Hibernate关联映射(单项多对一和一对多、双向一对多)

    最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...

  2. Hibernate关联映射之_一对一

    数据库模型 一般对一对一的关系而言,会存在一个主从关系.如 人 与 身份证,就是一个一对一关系, 人 是主,身份证 是从 Person PK:id name age Id_Card PK.FK:id ...

  3. Hibernate关联映射之_一对多

    domain: package org.zln.hibernate.domain; import java.util.Set; /** * 部门Domain对象 * Created by sherry ...

  4. (转)Hibernate关联映射——一对多(多对一)

    http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...

  5. Hibernate关联映射(一对多/多对多)

    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053.  Hibernate关联映射上接Hibernate持久化类:h ...

  6. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  7. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  8. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  9. 【学习笔记】Hibernate关联映射(Y2-1-6)

    Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...

随机推荐

  1. ubuntu系统快速搭建开发环境

    1.免密登陆 1.1 原理 ssh协议中用到了对称加密和非对称加密,如果不了解可以百度一下,原理引用一下这篇博客 在ssh中,非对称加密被用来在会话初始化阶段为通信双方进行会话密钥的协商.由于非对称加 ...

  2. spring的事务处理

    说到事务,无非就是事务的提交commit和回滚rollback. 事务是一个操作序列,这些操作要么全部都执行成功,事务去提交,要么就是有一个操作失败,事务去回滚. 要知道事务的4大特性ACID.即原子 ...

  3. django环境搭建和学习

    由于服务器down了好几天,前几天做的django的project全都在上面,无法继续开展工作,所以决定在本地重新部署一套virtualenv 之前没有好好整理过部署过程(其实也不难),所以决定写个随 ...

  4. C#中的线程(二)线程同步基础 (读后感)

    参考文章:https://www.cnblogs.com/dingfangbo/p/5769501.html 一.lock 确保只有一个线程访问某个资源或某段代码.通俗的讲就是多个线程操作相同的锁对象 ...

  5. MongoDB学习(1)--安装,基本curd操作

    知识点: 1-MongoDB 安装,启动和卸载 2-基本概念 3-基本的增删改查操作(CURD) 来回顾总结一把学习的mongodb,如果有javascript基础,学习"芒果DB" ...

  6. 谭浩强第四版第九章课后习题12>>>建立一个链表,每个节点包括:学号、姓名、性别、年龄。输入一个年龄,若链表 中的结点所包含的年龄等于此年龄,则删除此结点。

    #include<stdio.h> #include<stdlib.h> #define N sizeof(link) typedef struct lin { struct ...

  7. Kubernetes-GC

    Kubernetes集群中垃圾回收(Garbage Collection)机制由kubelet完成.kubelet定期清理不再使用的容器和镜像,每分钟进行一次容器的GC操作,每五分钟进行一次镜像的GC ...

  8. Spark 实践

    1.1 避免使用 GroupByKey   让我们看一下使用两种不同的方式去计算单词的个数,第一种方式使用 reduceByKey, 另外一种方式使用 groupByKey: val words = ...

  9. Spring配置文件一直报错的根源所在

    跳坑后的感悟总结 Spring在配置文件中经常会报XML错误,以下是几种常见的解决办法 方式一:打开eclipse-->Project-->Clean ;清除一下 方式二:查看xml配置文 ...

  10. Python中该使用%还是format来格式化字符串?

    %还是format 1.皇城PK Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是fo ...