hibernate学习笔记(三)

session(回话)接口

1.Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
2.Session实例通过SessionFactory获取,用完需要关闭。
3.Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSessiong()。
4.Session可以看做是持久化管理器,它是与持久化操作相关的接口

代码举例(前边我们也是用过了):

Configuration cf=new Configuration().configure();
		      SessionFactory sf=cf.buildSessionFactory();
		      Session s=sf.getCurrentSession();
		      //或者是: Session s=sf.openSession();

Session一般以对象的形式来操作,主要是CRUD(save   delete   update   load/get)

注意前几个都没什么问题,现在就是查询的时候的两种方式load和get的区别是什么呢

1.get()方法直接返回实体类,如果查不到数据则返回null。load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象), 但当代理对象被调用时,如果没有数据不存在,就会抛出org.hibernate.ObjectNotFoundException异常

2.load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load在默认情况下支持延迟加载(lazy)

但是get先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)

因此,如果确定DB中有这个对象就用load(),不确定就用get(),这样的话效率是最高的

<class  name="Employee" lazy="false" table="employee">
我们可以通过这行代码取消懒加载,这样懒加载就会被禁用,系统默认是true

这样我们有看出了hibernate的好处,通过session缓存和二级缓存大大减少了对数据库的平凡访问,提高了效率,这也是hibernate的好处之一


我们现在写一个session的工具类,似的它可以直接返回全新的session和线程相关的session(之前写的MySessionFactory只能生成全新的session),代码如下:

package com.cyj.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil { //SqlHelper 
	private static SessionFactory sessionFactory=null;
	//使用线程局部模式
	private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
	private HibernateUtil(){};
	static {
		sessionFactory=new Configuration().configure().buildSessionFactory();
	}
	
	//获取全新的全新的sesession
	public static Session openSession(){
		return sessionFactory.openSession();
	}
	//获取和线程关联的session
	public static Session getCurrentSession(){
		
		Session session=threadLocal.get();
		//判断是否得到
		if(session==null){
			session=sessionFactory.openSession();
			//把session对象设置到 threadLocal,相当于该session已经和线程绑定
			threadLocal.set(session);
		}
		return session;
		
		
	}
	


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值