单项多对一
封装类:
Dept.java:
public class Dept {
private Byte deptNo;
private String deptName;
private String location;
}
Emp.java:
public class Emp {
private Integer empNo;
private String empName;
private Dept dept;
}
在emp.hbm.xml中用
many-to-one来映射多对一的关联关系
name:多的一端关联一的一端的属性名
class:一的一端属性对应的类名
双向多对一:
在dept封装类写了一个set集合
public class Dept {
private int deptId;
private String deptName;
private Set<Emp> emp=new HashSet<Emp>();
}
在dept.hbm.xml中映射一对多的集合属性使用set节点
name:集合对应的属性名
table:set中的元素对应的记录放在哪一个数据表中,该值需要和多对一的多的表名一致
key:指定多的表中的外键列的名字
set三个属性:cascade级联、inverse反转、order-by
懒加载load 当没有进行操作时load方法不会对数据库操作没有sql语句 但是有操作室就会有sql输出
没有操作时:
//懒加载没有sql语句
public void testLoad(){
Emp emp=(Emp)session.load(Emp.class, 1);
}
有操作输出时:
//懒加载没有sql语句
public void testLoad(){
Emp emp=(Emp)session.load(Emp.class, 1);
//对数据库操作才会发sql
System.out.println(emp.getEmpName());
}
控制台:无输出
控制台:Hibernate:
select
emp0_.empId as empId1_1_0_,
emp0_.empName as empName2_1_0_,
emp0_.dept as dept3_1_0_
from
test_Emps emp0_
where
emp0_.empId=?
小王
get方法直接会对数据库查询并输出sql语句不管有没有输出直接查询
public void testGet(){
Emp emp=(Emp)session.get(Emp.class, 1);
}
控制台:
Hibernate:
select
emp0_.empId as empId1_1_0_,
emp0_.empName as empName2_1_0_,
emp0_.dept as dept3_1_0_
from
test_Emps emp0_
where
emp0_.empId=?