Hibernate get與load區別

get 和 load 區別
load加載方法:
Java代碼

1. Users user = (Users)session.load(Users.class, userId);

Users user = (Users)session.load(Users.class, userId);

get 加載方法:
Java 代碼

1. Users user = (Users)session.get(Users.class, userId);

Users user = (Users)session.get(Users.class, userId);



兩加載方法區別:

區別1:如果數據庫中,沒有userId的對象。如果通過get方法加載,則返回的是一個 null;如果通過load加載,則返回一個代理對象,如果後面代碼如果調用user對象的某個屬性(比如user.getPassword())會拋出異常:org.hibernate.ObjectNotFoundException;

區別2:load支持延遲加載,get不支持延遲加載。
也就是說:
Java代碼

1. Users user = (Users)session.load(Users.class, userId);

Users user = (Users)session.load(Users.class, userId);

這句代碼不會去執行數據庫查詢,只有用到user時纔會去執行數據庫查詢。
而:
Java代碼

1. Users user = (Users)session.get(Users.class, userId);

Users user = (Users)session.get(Users.class, userId);

則立即去執行數據庫查詢。 所以Users user = (Users)session.load(Users.class, userId);不會執行任何sql。
注意:
Java代碼

1. Users user = (Users)session.load(Users.class, userId);
2. System.out.println(user.getId());

Users user = (Users)session.load(Users.class, userId);
System.out.println(user.getId());

上面這2句代碼,不會去執行數據庫操作。因爲load後會在 hibernate的一級緩存裏存放一個map對象,該map的key就是userId的值,但是當你getId()時,它會去一級緩存裏拿map的 key值,而不去執行數據庫查詢。所以不會報任何錯。不會執行任何數據庫操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章