1、多对一
在多的一端增加外键、创建实体类时,在多方创建私有变量一方的对象
<many-to-onename="depart" column="depart_id" foreign-key=""not-null="true" />
foreign-key如果缺省,则代表外键为其他表的主键。 不缺省则可以指定字段
插入操作:
Departmentdep = new Department();
dep.setName("departone");
Employeee1 = new Employee();
e1.setName("Tom");
e1.setDepart(dep);
s.save(dep);
s.save(e1);
tx.commit();
如果先保存Employee对象,则系统先将depart_id默认为null,执行完保存dep,它就会自动修改同步departe_id
查询操作:
s=HibernateUtil.getSession();
Employeee=(Employee) s.get(Employee.class, empId);
System.out.println(e.getName()+"\t"+e.getDepart().getName()); //执行懒加载
returne;
对于查询Employee对象,则第一个使用方法的查询,则查询到外键的时,系统则采用懒加载技术,如果放在方法外,则会抛异常,因为session已经被释放,无法执行懒加载的查询
2、一对多
<propertyname="name" column="name"/>
<setname="emps">
<!--指定员工表中外键的列名 -->
<keycolumn="depart_id"></key>
<!--子标签在告诉这个集合表示一对多的关系并用class指定集合存放的对象类型-->
<one-to-manyclass="Employee" />
</set>
Departmentdep = new Department();
dep.setName("departone");
Employeee1 = new Employee();
Employeee2=new Employee();
e2.setName("marico");
e2.setDepart(dep); //建立了关联
e1.setName("Tom");
e1.setDepart(dep);
s.save(dep);
s.save(e1);
s.save(e2);
//也可以建立关联,此时系统自动调用update方法来执行更新
Set<Employee>set=new HashSet<Employee>();
set.add(e1);
set.add(e2);
dep.setEmps(set);
s.save(dep);
Departmentd=(Department) s.get(Department.class, depId);
System.out.println(d.getName()+"\t"+d.getEmps().size());
3、如果同时实现一对多和多对一的操作,则可成为双向关联。双向关联可以由在其中的任何一个对象得到另一个关联的对象。在一方和多方都可以实现。
如果没有同时则称之为单向关联,在一对多情况下。在一方可以得到多方。在多对一同理。例如学生和老师: 如果实现一对多关系。 则
单向,
一对多:老师-----à学生 可以从老师对象中得到它的学生。
多对一:学生-----à老师 可以从学生对象中得到他的老师。
双向:
可以从老师对象中得到它的学生。也可以从学生对象中得到老师的对象。