hibernate中 cascade是和增刪改有關的 而查的功能是和fetch有關的sql
如下主要說下fetch的用法: session
FetchType有EAGER和LAZY兩種 舉例來講 User類和Group類app
User類中存在fetch
private Group group;
@ManyToOne(cascade={CascadeType.ALL})
public Group getGroup() {
return group;
} hibernate
Group類中存在代理
@OneToMany(mappedBy="group",
cascade={CascadeType.ALL},
fetch=FetchType.LAZY
)
public Set<User> getUsers() {
return users;
} 對象
多對一的雙向關聯 User是多的一方 Group是一的一方 hibernate默認多的一方的FetchType=EAGER 即取得User時默認取出對應的Groupget
反之在Group默認的是FetchType=LAZY 默認不會取出 it
在此同時討論下hibernate中的get 和load 主要講下load io
hibernate在使用Session.load的時候 生成的是代理對象 不會發出sql語句 而是在使用的時候發出 例如:
public void testLoadUser() {
testSaveGroup();
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
User u = (User)s.load(User.class, 1);
System.out.println(u.getName());
s.getTransaction().commit();
}
當u.getName時才發sql語句 可是若是這條語句放在 s.getTransaction().commit();以後執行 就會報no Session的錯誤 是由於實際代理對象發出sql語句的時候session已經關閉