• SSH开发实践part2:双向1-N连接配置


    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接口,主要为了方便对象的实例化,不清楚的可以百度一下。

    public class Payment implements Serializable{
    
        private static final long serialVersionUID = 99L;
        private int id;
        private Employee emp;
        private int year;
        private int month;
        private double salary;
    }

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

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

    4  

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

    <hibernate-mapping package="com.souvenir.bean">
        <class name="Payment" table="Payment">
            <!-- 映射标识属性 -->
            <id name="id" column="payment_id"
                type="int">
                <!-- 指定主键生成器策略 -->
                <generator class="identity"/>
            </id>
            <!-- 映射普通属性 -->
            <property name="year" type="int"/>
            <property name="month" type="int"/>
            <property name="salary" type="double"/>
            <many-to-one name="emp" class="Employee" lazy="false" not-null="true" column="emp_id"/>
        </class>
    </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>配置

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

      

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

        <!-- 映射和Payment之间的关联关系 -->
            <set name="payments" inverse="true" lazy="false">
                <key column="emp_id" />
                <one-to-many class="Payment"/>
            </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端对象。

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

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

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

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

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

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

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

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

      

  • 相关阅读:
    快速排序和归并排序
    docker 配置redis主从配置 集群 正式部署
    物联网平台定位
    如何让我的设备连接上云?参考如下路径
    MQTT协议中文版
    org.eclipse.paho.client.mqttv3 源码解析(二) 接收
    org.eclipse.paho.client.mqttv3 源码解析(一) 发送
    基于mqtt的消息推送(三)客户端实现
    基于mqtt的消息推送(二)服务端实现
    基于mqtt的消息推送(一)技术选型
  • 原文地址:https://www.cnblogs.com/souvenir/p/3784510.html
Copyright © 2020-2023  润新知