通过一个简单的案例来了解Hibernate 通过XML配置方式实现一对多的添加和删除操作,一的一方dept (部门表),多的一方emp(员工表)
- 简单类(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>
- 简单类(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>
- 测试方法
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();
}
}