Hibernate的关联映射

来源:互联网 发布:java 垃圾回收 编辑:程序博客网 时间:2024/05/14 16:54

员工表和部门表就是多对一的关系

  部门表和员工表就是一对多的关系

  员工表Emp表

 public class Emp{  private int empId;  private String empName;  private Dept dept;       //员工对应的部门使用Dept类型的对象保存  //省略了get和set方法}

部门表 Dept 表

public class Dept{    private int deptid;    private String deptname;private Set<Emp> emps;   //部门下的员工集合使用set保存//省略了get和set方法}

1.     多对一映射

 员工表和部门表就是多对一的关系

员工类的xml配置文件 Emp.hbm.xml

<hibernate-mapping package="entity">    <class name="Emp" table="emp2">        <id name="empId">            <generator class="native"/>        </id>        <property name="empName"/>        <!--many-to-one中设置了dept非空,所以在session保持的时候需要按照顺序来,先添加部门,再添加员工,               如果可为空的话,顺序反过来的话,添加员工后其实员工数据中的部门id信息是为空的,在添加了部门信息以后,           hibernate还会再update员工的信息来保存部门的信息,不为空就自然要求顺序了-->        <!-- many-to-one中的name指的是Emp类中的dept属性,column=dept_id为数据库中的列名,hibernate        识别到dept的类型为Dept后,自动将Dept所对应的表的主键作为Emp对应表中dept_id的外键 -->        <!--lazy是否执行懒加载,在多对一中,默认为true在查询的时候会在需要用的时候查询,但是往往session        会在查询后直接关闭,想再获取emp中的dept就获取不到了,提示no session错误,设置lazy为false就不会懒加载了-->        <!-- fetch设置级联查询,查询语句使用级联查询 -->  <!-- 如果没有指定多对一的column属性,则自动将Dept中的主键作为外键在Emp中创建出来 -->        <many-to-one name="dept"column="dept_id" not-null="false"lazy="false" fetch="join"></many-to-one>    </class></hibernate-mapping>

操作:

//多对一的添加,HibernaUtil为工具类

Sessionsession =HibernateUtil.getSession();        Transaction tran=session.beginTransaction();        Dept dept=new Dept();        dept.setDeptname("开发部");        Emp emp =new Emp();        emp.setEmpName("汉汉");        emp.setDept(dept);          session.save(dept);    //先添加部门,再添加员工,可以提高效率        session.save(emp);        tran.commit();        session.close();        */        //多对一查询    /*    Sessionsession =HibernateUtil.getSession();     Empemp=(Emp)session.get(Emp.class,46);     System.err.println("员工姓名:"+emp.getEmpName());    session.close();    //如果没有设置lazy=false的话在session关闭后是取不到部门信息的    System.err.println("员工部门:"+emp.getDept().getDeptname());        */

2.一对多映射

  部门表和员工表就是一对多的关系

 部门类的xml的配置文件Dept.hbm.xml

<hibernate-mapping package="entity">    <class name="Dept" table="dept2">       <id name="deptid">            <generator class="native"/>       </id>       <property name="deptname"/>          //Dept中的emps在xml中使用set标签       <set name="emps" lazy="false" cascade="all">//cascade级联操作         <key column="dept_id"/>      //指定副表的外键  <!-- 如果没有指明key属性,则会自动将部门的主键作为Emp中的外键创建出来-->         <one-to-many class="Emp"/>  //指定副表的类       </set>    </class></hibernate-mapping>

//一对多的添加

Sessionsession=HibernateUtil.getSession();    Transactiontran=session.beginTransaction();    Deptdept=new Dept();    dept.setDeptname("研究部2");    Set<Emp>set=new HashSet<Emp>();       Empemp1=new Emp();    emp1.setEmpName("哈哈2");    emp1.setDept(dept);    set.add(emp1);       Empemp2=new Emp();    emp2.setEmpName("呵呵2");    emp2.setDept(dept);    set.add(emp2);     dept.setEmps(set); //设置了级联后添加了部门,员工也自然添加了,不过这只是个例子,真实的业务中应该很少有添加部门后立马添加员工的操作    session.save(dept);    tran.commit();    session.close();          //一对多的查询    Sessionsession=HibernateUtil.getSession();    Dept dept=(Dept)session.get(Dept.class,44);    Set<Emp>empset=dept.getEmps();    for(Emp e:empset)    {         System.out.println("员工:"+e.getEmpName()+","+"部门:"+e.getDept().getDeptname());    }    session.close();

3.一对一映射

身份证和人就是一对一的关系

人实体类 Person类:

  public class Person {           private int pid;           private String name;           private IdCard idcard;            //省略get和set方法    }

身份证实体类 IdCard类:

  public class IdCard {           private int cid;           private String fromCity;        private Person person;          //省略get和set方法}

   人实体类对应的xml文件  Person.hbm.xml(主表的xml配置)

  <hibernate-mappingpackage="entity">    <class name="Person"table="person">       <id name="pid">            <generatorclass="native"/>       </id>       <property name="name"/>       <one-to-one name="idcard"/>         </class></hibernate-mapping>

身份证实体类的xml文件 IdCard.hbm.xml(从表的xml配置)

<hibernate-mappingpackage="entity">  <classname="IdCard" table="id_card">         <idname="cid">            <generatorclass="foreign">   //外键设置              <paramname="property">person</param>            </generator>         </id>         <propertyname="fromCity"/><one-to-one name="person"constrained="true"/>    //constrained=”true”:添加约束,实现外键  </class></hibernate-mapping>

原创粉丝点击