1. 程式人生 > >hibernate中的load和get區別

hibernate中的load和get區別

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();
	}
}