1.N-1映射示例:
假设有两张表,建立主外键关联
员工<--->部门
员工 Domain:
private Integer id;
private String name;
private Department dept;
员工Hibernate配置:
id_inc
部门Domain:
private Integer id; private String name;
部门hbm
id_inc
Department dept1 = new Department(); Department dept2 = new Department(); dept1.setName("财务"); dept2.setName("后勤"); Student st1 = new Student(); Student st2 = new Student(); st1.setName("风姿"); st2.setName("导师"); st1.setDept(dept1); st2.setDept(dept1); session.save(dept1); session.save(dept2); session.save(st1); session.save(st2); trans.commit();
2.one-to-many映射
当需要查询出一个部门中有多少个学生的情况下需要配置:
Department: private Setstu; public Set getStu() { return stu; } public void setStu(Set stu) { this.stu = stu; }
相应的hbm.xml文件为:
测试:
1. //查询一个部门中有多少名学生 Department dept1 = (Department) session.get(Department.class, 3); Setset = dept1.getStu(); for(Student s:set){ System.out.println("student:"+s.getName()); } 2. Department department=new Department(); department.setName("业务部门"); Student stu1=new Student(); stu1.setName("顺平"); Student stu2=new Student(); stu2.setName("小明"); Set sets=new HashSet (); sets.add(stu1); sets.add(stu2); department.setStu(sets); session.save(stu1); session.save(stu2); session.save(department);
其中在测试的过程中一直出现一个错误:
org.hibernate.InvalidMappingException: Could not parse mapping document from resource
后来发现hibernate.config.xml中配置了:
可能是名称相同互相干扰的原因,去掉不相干的一组后可以正常测试!
3.one-to-one主键一对一关联
案例:一个人对应一个身份证
private Integer id; private String name; private Idcard idcard;
private Integer id; private Date date; private Person person;
采用手动分配主键策略
id_inc
设置外键,从而是Person中的id与Idcard中id保持一致
class name="Idcard" table="idcard_db">person
测试:
Person p1=new Person(); p1.setId(1); p1.setName("jk"); Idcard idCard=new Idcard(); idCard.setDate(new Date()); idCard.setPerson(p1);//表示idCard对象是属于p1这个对象. session.save(p1);//先保存人 session.save(idCard);
4.one-to-one基于外键
这样设置的话,那么idcard_db表中就会多一个person的id列
测试:
Person p1=new Person(); p1.setId(1); p1.setName("jk"); Idcard idCard=new Idcard(); idCard.setId(1234); idCard.setDate(new Date()); idCard.setPerson(p1);//表示idCard对象是属于p1这个对象. session.save(p1);//先保存人 session.save(idCard);
5.many-to-many
这个映射关系一般很难表示,可以拆分为多对一或者一对多,一对一的组合
例如学生与课程之间的关系为多对多关系
可以建立一个学生课程表作为学生表与课程表的中间表
那么这样,学生与学生课程表之间就是一对多关系,课程与学生课程表之间也是一对多关系。
学生Domain设计:
private Integer id; private String name; private SetstuCourse;
学生hbm配置,因为有一个一对多关系,所以要把Set映射到hbm文件中:
id_inc
课程Domain,与学生Domain类似:
private Integer id; private String name; private SetstuCourse;
对应的hbm文件:
id_inc
学生课程表:
private Integer id; private Student stu; private Course course; private Integer grade;
该表与学生表和课程表关系均为多对一关系,所以配置文件为:
注意的是,学生课程表中many-to-one中的column作为学生和课程表中外键来使用。id_inc