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