标签:hibernate
一:hibernate的核心类和接口1.Configuration 类
它的用处是:
a. 读取hibernate.cfg.xml
b. 管理对象关系映射文件 <mapping resource=””>
c. 加载hibernate 的驱动,url ,用户..
d. 管理hibernate配置信息
2.SessionFactory (会话工厂)
a. 可以缓存sql语句和数据(称为session级缓存)!!
b. 是一个重量级的类,因此我们需要保证一个数据库,有一个SessionFactroy
通过SessionFactory获取 Session的两个方法 openSession() 一个 getCurrentSession();
|. openSession() 是获取一个新的session
||. getCurrentSession () 获取和当前线程绑定的session,换言之,在同一个线程中,我们获取的session是同一session,这样可以利于事务控制
Session|||. 果需要在同一线程中,保证使用同一个Session则,使用getCurrentSession(),如果在一个线程中,需要使用不同的Session,则使用opentSession()
通过 getCurrentSession() 获取的session在事务提交后,会自动关闭,通过openSession()获取的session则必须手动关闭.
如果是通过getCurrentSession() 获取 sesssion ,进行查询需要事务提交
3.全局事务和本地事务
a. 如何确定你的session有没有及时关闭
windows cmd netstat –an [oracle 1521mysql 3306 sql server 1433]
linux/unix netstat –anp top
b. session接口
它的主要功能和作用是:
|. Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
||. Session实例通过SessionFactory获取,用完需要关闭。
|||. Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSessiong()。
||||. Session可以看做是持久化管理器,它是与持久化操作相关的接口
二:get和load
1. 如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException
Users use=(Users)session.get(load)(Users.class, 8);
2. 使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(查询语句select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用(比如输出查询结果时候System.out.println();)查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)
3. 通过修改配置文件,我们可以取消懒加载
<class name="Employee"lazy="false" table="employee">
4. 如何选择使用哪个: 如果你确定DB中有这个对象就用load(),不确定就用get()(这样效率高)
三:一级和二级缓存
session缓存称为一级缓存,内存或者磁盘缓存称为二级缓存
使用load进行查询时,现在session级缓存查询,如果没有,进行二级缓存查询,最后进入数据库查询,如果查询到,
则把结果保存在二级缓存中,下次查询相同的信息时,直接进入二级缓存进行查询,
Session session=MySessionFactory.getSessionFactory().openSession();
try {
//修改用户,前提获取该用户
Usersuse=(Users) session.load(Users.class, 2);
System.out.println(use.getName());
Usersuse2=(Users) session.load(Users.class, 2);
System.out.println(use2.getEmail());
}finally{
//关闭session
if(session!=null &&session.isOpen()){
session.close();
}
}
上面的查询结果可知,两次查询,只向数据库发送了一次请求,所以上面的结论正确
package com.cloud.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
final public class HibernateUtil{
privatestatic SessionFactory sessionFactory=null;
//使用线程局部模式
privatestatic ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
//私有构造函数,不允许别人随便创建
privateHibernateUtil(){};
static{
sessionFactory=newConfiguration().configure().buildSessionFactory();
}
//获取全新的Session
publicstatic Session openSession(){
returnsessionFactory.openSession();
}
//获取和线程关联的session
publicstatic Session getCurrentSession(){
Sessionsession=threadLocal.get();
//判断是否获取到了
if(session==null){
//如果没有获取,就自行创建一个
session=sessionFactory.openSession();
//把session对象和线程绑定
threadLocal.set(session);
}
returnsession;
}
}
package com.cloud.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
//该类不能被继承
//使用hibernate开发项目时,保证一个数据库只有一个sessionFactory
final public class MySessionFactory{
privatestatic SessionFactory sessionFactory=null;
privateMySessionFactory(){
}
static{
sessionFactory=newConfiguration().configure().buildSessionFactory();
}
publicstatic SessionFactory getSessionFactory(){
returnsessionFactory;
}
}
版权声明:博主原创文章,转载请说明出处。http://blog.csdn.net/dzy21
标签:hibernate
原文地址:http://blog.csdn.net/dzy21/article/details/47774949