Hibernate:單項多對一雙向多對一
單項多對一
封裝類:
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=?