hibernate中的load和get區別
阿新 • • 發佈:2018-10-31
package com.zking.dao.daoImpl; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; import com.zking.dao.UserDao; import com.zking.entity.User; import com.zking.util.HibernateUtli; public class UserDaoImpl implements UserDao { /** * 講解一級快取 * * 一級快取又稱session級別的快取 * 1.相當於資料庫某一條資料在hibernate中產生一個快照 * 2.如果說user 發生改變,那麼它會與hibernate中的快照對比,如果不一致就儲存到資料庫 */ @Override public User load(User user) { /** * 不存在初始化代理 * could not initialize proxy(代理) - no Session * 懶載入(延遲載入)問題: * 將查詢的oid(object id)儲存到session的代理proxy中當要真正用到查詢物件時候,再去執行SQL */ Session session = HibernateUtli.openSession(); System.out.println(55555); Transaction transaction = session.beginTransaction(); User t = session.load(User.class, user.getId()); transaction.commit(); System.out.println(66666); System.out.println(t); HibernateUtli.closeSession(); return t; } /** * 立即載入 * 對於get和load的根本區別,就是hibernate對於load方法認為該資料在資料庫中一定存在, * 可以放心的使用代理來延遲載入,如果在使用過程中發現了問題, * 只能拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。 */ @Override public User get(User user) { Session session = HibernateUtli.openSession(); Transaction transaction = session.beginTransaction(); System.out.println(55555); User t = session.get(User.class, user.getId()); transaction.commit(); System.out.println(66666); System.out.println(t); HibernateUtli.closeSession(); return t; } }
2.測試
package com.zking; import java.util.List; import org.junit.Before; import org.junit.Test; import com.zking.dao.UserDao; import com.zking.dao.daoImpl.UserDaoImpl; import com.zking.entity.User; public class UserDAOTest { private User user = null; private UserDao userDao = null; @Before public void setUp() throws Exception { user = new User(); userDao = new UserDaoImpl(); } @Test public void testLoad() { user.setId(6); user = userDao.load(user); //當要真正用到查詢物件時候,session已經關閉 System.out.println(user); } @Test public void testget() { user.setId(6); user = userDao.get(user); } }
package com.zking.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; /** * hibernate工具類 * 未整合框架前使用 * @author Administrator * */ public class HibernateUtli { private static SessionFactory sessionFactory; /** * 存放當前會話 */ private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); /** * 通過單例管理sessionFactory,整個系統執行過程中只會構建一個sessionFactory物件 */ static { //讀取配置檔案 獲取會話 開啟事務 sessionFactory = new Configuration().configure().buildSessionFactory(); } /** * 建模 獲取sessionfactory * @return * 2018年10月19日上午10:23:16 */ public static SessionFactory getSessionFactory() { return sessionFactory; } /** * 開啟一個session * @return * 2018年10月19日上午10:20:58 */ public static Session openSession() { Session session = threadLocal.get(); if (null == session) { session = sessionFactory.openSession(); threadLocal.set(session); } return session; } /** * 開啟與執行緒繫結的session * @return * 2018年10月19日上午10:24:32 */ public static Session getCurrentSession() { Session session = threadLocal.get(); if (null == session) { //預設建模的(hibernate.cfg.xml) session = sessionFactory.openSession();// 如果session為空就建立一個session threadLocal.set(session);// 放到當前的執行緒中 return session; } return session; } /** * 關閉session * * 2018年10月19日上午10:21:17 */ public static void closeSession() { Session session = threadLocal.get(); if (null != session) { if (session.isOpen()) { session.close(); } threadLocal.set(null); } } /** * 測試 * @param args * 2018年10月19日上午10:25:41 */ public static void main(String[] args) { Session session = openSession(); System.out.println(session.isConnected()); closeSession(); } }