员工表和部门表就是多对一的关系
部门表和员工表就是一对多的关系
员工表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设置级联查询,查询语句使用级联查询 --> <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"/> //指定副表的外键 <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>