1.概述:
应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。
SessionFactory是线程安全的(Thread-Safe),可以让多个执行线程同时存取SessionFactory而不会有数据共享的问题。
会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
需要注意的是SessionFactory是重量级的,因为一 般情况下,一个项目通常只需要一个SessionFactory就够(单例模式),当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
调用代码:
SessionFactory sessionFactory = cfg.buildSessionFactory();
2.概述:
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流)
Session也称为持久化管理器,因为它是与持久化有关的操作接口。
Session不是线程安全的,应该避免多个线程共享同一个Session实例。
Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
保证在一个线程中仅存在一个Session实例
getCurrentSession (Hibernate 3)
可以采用ThreadLocal的办法. (Hibernate 2)
把Session对象放在方法内部定义.
它与Web层的HttpSession没有任何关系。
3.那么,如何构建单态模式下的SessionFactory?
一种是私有构造方法,提供公共接口。
一种是用静态代码块。
我用的方法是第二种。
所以在项目中,要抽取出一个HibernateUntils工具类,用来提供Session对象。
配置文件等信息请见上次文章代码如下:
package com.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
//声明一个私有的静态final类型的Configuration对象
private static final Configuration config;
//声明一个私有的静态final类型的SessionFactory对象
private static final SessionFactory factory;
//通过静态代码块构建SessionFactory
static {
config=new Configuration().configure();
factory=config.buildSessionFactory();
}
//提供一个共有的静态方法供外部获取,并返回一个session对象
public static Session getSession(){
return factory.openSession();
}
}
在测试类中直接引用工具类中的方法:
package com.entity;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import org.hibernate.SessionFactory;
import com.utils.HibernateUtils;
public class TestDemo1 {
//定义变量
Configuration config=null;
SessionFactory sessionFactory=null;
Session session=null;
Transaction transaction=null;
@Test
public void insert()
{
try {
//直接引用HibernateUtilS工具类中的getSession()方法
session=HibernateUtils.getSession();
//4.开始事务
transaction=session.beginTransaction();
//5.操作
Customer cus=new Customer();
cus.setUsername("小良");
cus.setAge(20);
cus.setSex("男");
cus.setCity("哈尔滨");
session.save(cus);
//6.提交事务
transaction.commit();
//7.关闭资源
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//删除操作
@Test
public void delete()
{
try {
//直接引用HibernateUtilS工具类中的getSession()方法
session=HibernateUtils.getSession();
//4.开始事务
transaction=session.beginTransaction();
//5.操作
//先查询
Customer cus=(Customer)session.get(Customer.class,3);
//再删除
if(cus!=null)
{
session.delete(cus);
}
//6.提交事务
transaction.commit();
//7.关闭资源
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//查询操作
@Test
public void select()
{
try {
//直接引用HibernateUtilS工具类中的getSession()方法
session=HibernateUtils.getSession();
//4.开始事务
transaction=session.beginTransaction();
//5.操作
Customer cus=(Customer)session.get(Customer.class,2);
System.out.println(cus);
//6.提交事务
transaction.commit();
//7.关闭资源
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//更新操作
@Test
public void update()
{
try {
//直接引用HibernateUtilS工具类中的getSession()方法
session=HibernateUtils.getSession();
//4.开始事务
transaction=session.beginTransaction();
//5.操作
Customer cus=(Customer)session.get(Customer.class,1);
//修改地址为beijing
cus.setCity("青岛");
//存在就更新,不存在就执行插入操作
session.saveOrUpdate(cus);
//6.提交事务
transaction.commit();
//7.关闭资源
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通过单元测试:
insert()测试:
数据库中成功添加username=“小良”的一组数据
select()测试:
成功搜索到数据
成功将username="肖嘉良"的city信息将哈尔滨更新成青岛
delete()测试:
成功删除数据
执行成功