Hibernate 一对多添加数据 (XML配置方式)

通过一个简单的案例来了解Hibernate 通过XML配置方式实现一对多的添加和删除操作,一的一方dept (部门表),多的一方emp(员工表)

  1. 简单类(dept)
public class Dept implements java.io.Serializable {
    private Long deptno;
    private String dname;
    private String loc;
    private Set emps = new HashSet();
    //get set 方法省略
    }

2.配置清单 Dept.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.zrrd.text2.Dept" table="DEPT" schema="ZHH">
    <!-- 主键 -->
        <id name="deptno" type="java.lang.Long">
            <column name="DEPTNO" precision="10" scale="0" />
            <generator class="assigned" />
        </id>
        <!-- 属性  -->
        <property name="dname" type="java.lang.String">
            <column name="DNAME" length="14">

            </column>
        </property>

        <property name="loc" type="java.lang.String">
            <column name="LOC" length="13" />
        </property>

        <!-- 
    设置级联关系cascade="save-update" 
    设置为none , 没有级联操作
    设置为 save-update,级连保存或者更新 当save一方的时候,如果这时关联了瞬时态的多方,也就是多执行了一次insert,最后再执行update 
    设置为 delete,级连删除 当删除一方的时候,会同时去删除其所关联的多方    
          -->
        <set name="emps" cascade="save-update delete">
            <key>
            <!-- 另一个表的外键 -->
                <column name="DEPTNO" precision="2" scale="0" />
            </key>
            <!-- 一对多配置 -->
            <one-to-many class="com.zrrd.text2.Emp" />
        </set>

    </class>
</hibernate-mapping>
  1. 简单类(emp)
public class Emp implements java.io.Serializable {
    private Short empno;
    private Dept dept;
    private String ename;
    private String job;
    //get set 方法省略
    }

4.配置清单 Emp.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.zrrd.text2.Emp" table="EMP" schema="ZHH">

    <!-- 主键  -->
        <id name="empno" type="java.lang.Short">
            <column name="EMPNO" precision="4" scale="0" />
            <generator class="assigned" />
        </id>

        <!-- 多对一配置  -->
        <many-to-one name="dept" class="com.zrrd.text2.Dept" fetch="select">
        <!-- 本表的外键 -->
            <column name="DEPTNO" precision="2" scale="0" />
        </many-to-one>

        <!-- 属性 -->
        <property name="ename" type="java.lang.String">
            <column name="ENAME" length="10" />
        </property>
        <property name="job" type="java.lang.String">
            <column name="JOB" length="9" />
        </property>
        <property name="mgr" type="java.lang.Short">
            <column name="MGR" precision="4" scale="0" />
        </property>
        <property name="hiredate" type="java.util.Date">
            <column name="HIREDATE" length="7" />
        </property>
        <property name="sal" type="java.lang.Double">
            <column name="SAL" precision="7" />
        </property>
        <property name="comm" type="java.lang.Double">
            <column name="COMM" precision="7" />
        </property>
    </class>
</hibernate-mapping>
  1. 测试方法
public class MainText {


    public static void main(String[] args) {

        Session session=null;
        Transaction transaction=null;
        session=HibernateSessionFactory.getSession();//得到session
        transaction=session.beginTransaction();//开启事务

        //dept对象
        Dept dept=new Dept();
        dept.setDeptno((long) 80);
        dept.setDname("产品部");
        dept.setLoc("北京");

        //emp对象一
        Emp emp=new Emp();
        emp.setEmpno((short) 48);
        emp.setEname("张三");
        emp.setJob("研发");

        emp.setDept(dept);//emp关联dept

        //emp对象二
        Emp emp2=new Emp();
        emp2.setEmpno((short) 49);
        emp2.setEname("李四");
        emp2.setJob("研发");

        emp2.setDept(dept);//emp关联dept

        //dept关联emp
        dept.getEmps().add(emp);
        dept.getEmps().add(emp2);


        //设置了级联关系,所以当添加了dept的时候hibernate会自动自动添加关联的emp

        //只需保存一的一方
        session.save(dept);

        //只需删除一的一方
        //session.delete(dept); 

        transaction.commit();
        session.close();

    }

}

猜你喜欢

转载自blog.csdn.net/muscleheng/article/details/77822552
今日推荐