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

猜你喜欢

转载自blog.csdn.net/f_1314520/article/details/83276529