1  

  OK,上一篇已经介绍了项目开发的前期准备工作,具体内容可以参考:http://www.cnblogs.com/souvenir/p/3783686.html

  按照开发步骤,我们现在已经可以开始进行业务逻辑组件层的开发工作了。但是之前只写了一个bean,而且结构也相对很简单,对于大型项目来说肯定是不够的,所以

  本章节的重点就是来创建更多的bean对象,为后面的逻辑组件开发做好准备工作。

  对了,忘了介绍,我们是根据书上需求,准备做一个简单的HR系统,包括简单的请假,查工资等功能。

2

  有人肯定疑惑了,之前已经做了一个bean的参考,其他的bean照着做不就行了吗,为什么还要单独讲。

  好吧,之前的employee只是一个非常简单的bean,在现实的开发项目中肯定有很多关系复杂的bean,我们要通过hibernate以及spring来完成对

  他们的管理和调用。ok,话不多少,下面开始吧。

3  

  现在我们做一个员工工资实体对象,具体属性包括id,emp,year,month,amount。

  先完成payment对象:

  对了,这里bean对象实现了Serializable接口,主要为了方便对象的实例化,不清楚的可以百度一下。

  1. public class Payment implements Serializable{
  2.  
  3. private static final long serialVersionUID = 99L;
  4. private int id;
  5. private Employee emp;
  6. private int year;
  7. private int month;
  8. private double salary;
  9. }

  篇幅问题,我们省略了各属性的set与get方法以及对象的构造函数。

  这个bean和之前的employee没有什么大的区别,主要是多了一个对其他对象的引用。

4  

  创建好bean对象以后,我们来创建hibernate映射文件。

  1. <hibernate-mapping package="com.souvenir.bean">
  2. <class name="Payment" table="Payment">
  3. <!-- 映射标识属性 -->
  4. <id name="id" column="payment_id"
  5. type="int">
  6. <!-- 指定主键生成器策略 -->
  7. <generator class="identity"/>
  8. </id>
  9. <!-- 映射普通属性 -->
  10. <property name="year" type="int"/>
  11. <property name="month" type="int"/>
  12. <property name="salary" type="double"/>
  13. <many-to-one name="emp" class="Employee" lazy="false" not-null="true" column="emp_id"/>
  14. </class>
  15. </hibernate-mapping>

  OK,唯一需要强调的就是对emp这个对象的处理。员工的工资对象与员工应该是多对一的关系,因为一个员工可以有多份工资嘛。

  所以这里用了<many-to-one>来完成与emp的映射,使用class来指定其关联的对象类名,同时可以指定其在数据库表中的列名。

  这样就基本上完成了。

  需要提个醒的是,也是楼主刚开始犯错的地方,这里配置文件的name属性一定要和你定义的bean java文件中的属性名称一致,要不然系统会

  提示找不到对应的set/get函数。

5 双向1-N关联配置

  对于1-N的关联关系,hibernate是推荐使用双向1-N关联配置,因为可以方便互相调用。

  在本例中,employee就是1,payment就是N端,要实现二者的相互关联,需要如下设置:

  1端bean增加Set<N端>属性,以及相应的get/set函数

  N端bean增加1端的对象属性,以及对应的get/set函数

  这里payment我们已经添加了employee的属性,对于之前编写的employee类来说,我们也需要增加Set<Payment>配置

  1. private Set<Payment> payments= new HashSet<Payment>();

  

  对于hibernate xml配置,employee也要做相应的调整:

  1. <!-- 映射和Payment之间的关联关系 -->
  2. <set name="payments" inverse="true" lazy="false">
  3. <key column="emp_id" />
  4. <one-to-many class="Payment"/>
  5. </set>

  对应双向1-N的关联关系来说,一般是通过控制N端进行关联关系控制,所以这里我们把1端employee加上inverse=true属性

  两个配置文件中的one-to-many以及many-to-one的column值需要保持一致,hibernate通过这个值进行表的关联。

  上面我们用的是没有关联表的配置,大家也可以尝试通过关联表来实现,效果都一样,只是数据库中对出现一个中间的关联连接表。

6  还是测试

  完成上述开发以后,我们就可以在main函数里面进行测试了。

  1.数据的创建:由于是双向1-N关联,所以通过N端进行关联控制。体现在代码实现过程中就是先创建好N端对象,然后往N端对象中设置1端对象。

  1. for(int i=1;i<=10;i++){
  2. System.out.println("oooo==="+i);
  3. empDao.save(new Employee("souvenir"+i,i+1,"password"+i));
  4. }
  5.  
  6. Employee emp=empDao.get(2);
  7.  
  8. //双向1-N 让N端来控制关联关系
  9. for(int j=1;j<=12;j++){
  10. Payment payment=new Payment(2014,j,j*1002);
  11. payment.setEmp(emp);
  12. payDao.save(payment);
  13. }

  上述代码主要实现以下功能:先创建10个employee对象,然后取出其中一个,然后创建12个payment对象,并将其全部的employee属性都设置同一个。

  2.既然是双向连接,也就是说我们通过任一一端都可以取到对应的另一端。比如先通过N(payment)端访问1(employee)端

  1. Payment payment=payDao.get(2);
    System.out.println(payment.getEmp().getName()+"--"+payment.getEmp().getPassword());

  我们先拿一个N端对象payment,然后通过get函数取到employee对象。

  3.通过1(employee)端访问N(payment)端

  1.     Set<Payment> payments=empDao.get(2).getPayments();
  2. for(Payment p: payments){
  3. System.out.println(p.getYear()+"-"+p.getMonth()+":"+p.getSalary());
  4. }

  也就是说,我们通过人找到其对应的所有payment对象,这种业务也是比较常见的。

  

SSH开发实践part2:双向1-N连接配置的更多相关文章

  1. SSH开发实践part3:hibernate继承映射

    0 大家好.上次讲了关于hibernate中双向1-N的映射配置,可以参考:http://www.cnblogs.com/souvenir/p/3784510.html 实际项目中,对象间的关系比较复 ...

  2. Django快速开发实践:Drf框架和xadmin配置指北

    步骤 既然是快速开发,那废话不多说,直接说步骤: 安装Djagno 安装Django Rest Framework 定义models 定义Rest framework的serializers 定义Re ...

  3. SSH开发实践part1:Spring与Hibernate整合

    1 之前把SSH看完了,现在从头开始进行项目实践.现在讲整个过程中的点滴记录下来,希望对后来者有参考. 2 SSH是一个轻量级的java开发框架,struts负责MVC开发模式中的controller ...

  4. SSH开发实践part4:Spring整合Struts

    1 好了,前面spring与hibernate的整合开发我们基本上讲完了,现在要开始服务层的开发,也就是处理事务的action,在这里我们需要引入spring与struts的整合.也就是将action ...

  5. 一小时完成后台开发:DjangoRestFramework开发实践

    DjangoRestFramework开发实践 在这之前我写过一篇关于Django与Drf快速开发实践的博客,Django快速开发实践:Drf框架和xadmin配置指北,粗略说了一下Drf配置和基本使 ...

  6. javascript单例模式及开发实践

    定义: 保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点: 实现原理: 利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例; 主要用于: 全局缓存.登录浮窗等只需要唯一 ...

  7. 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记

    <疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践>学习笔记 二〇一九年二月十三日星期三2时28分54秒 前提:本书适合有初步HTML.CSS.JavaScri ...

  8. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  9. MVC5 网站开发实践 2、后台管理

    目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目   从这一部分开始做后台管理,首先是基本框架的 一.Data项目 1.项目添加EntityFramework引用 在Data项 ...

随机推荐

  1. vim替换及多行注释命令

    1.多行注释: . 进入命令行模式,按ctrl + v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来 . 按大写字母I,再插入注释符,例如// . 按esc键就 ...

  2. cocos2dx中如何从一张图片中切割一部分显示成小图片

    1.通常我们拿到的资源中,通常都是许多张小图片压缩到一张图片里了,我们如何在使用的时候把它切割出来呢? 2.例如我们要把上面这张图片按组分隔开来 CCSprite* newGameNormal = C ...

  3. BICEP单元测试计划——四则运算Ⅱ

    一.测试方法(Right-BICEP) 6个值得测试的具体部位: Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你 ...

  4. Struts2原码分析系列之一

    struts2概述 在struts2的官网上有这么一句话,翻译为:Apache Struts2是一个为企业级应用打造的优秀的.可扩展的WEB框架,该框架旨在充分精简应用程序的开发周期,从而减少创建.发 ...

  5. android 开发 解码gif图片,获取每帧bitmap

    环境:android 4.3  (注意对于android4.4版本解码出来不正确,除了第一帧正确外,其余的都是显示不同的地方)  通用版本见: android 开发对gif解码(适配android 4 ...

  6. timersmanager 解析

    最近在看crtmp源代码,看到timersmanager 模块时感觉很难理解,花了不少时间反复思考该模块 的逻辑,现在思考的结果记录下来,方便以后查阅. 构造函数中将处理时间方法传进来,将_lastT ...

  7. 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 题解: 如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配 硬石头什么 ...

  8. 【POJ】【1821】Fence

    DP/单调队列优化 题意:k个人粉刷总长为n的墙壁(或者说栅栏?),每个人有一个必刷点s[i](这个人也可以一点也不刷,如果刷就必须刷这个点),最大粉刷长度l[i](必须是连续粉刷一段),和粉刷一格的 ...

  9. URAL

    URAL 2035 输入x,y,c,  找到任意一对a,b 使得a+b==c&& 0<=a<=x && 0<=b<=y 注意后两个条件,顺序搞错 ...

  10. std::function,std::bind复习

    #include <iostream> #include <functional>//std::bind返回函数对象 void fun1(int a, int b) { std ...