Session:是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础。对象的生命周期、事务的管理、数据库的存取都与Session息息相关.
? Session对象是通过SessionFactory构建的,Hibernate有两种获取session的方式
????1、getCurrentSession()获得与当前线程绑定的session
package?com.deptsystem.util;??
import?org.hibernate.Session;??
import?org.hibernate.SessionFactory;??
import?org.hibernate.cfg.Configuration;??
/**?
?*?Hibernate的帮助类,用来获取Session?
?*
?*/??
public?class?HibernateUtil?{??
????//将sessionFactory设为静态,可以保证其整个应用程序中的唯一性??
????private?static?final?SessionFactory?sessionFactory?=?new?Configuration().configure().buildSessionFactory();??
????private?HibernateUtil(){};??????????????????????????????//将构造方法设为似有,只能使用“类名+静态方法”的方式调用??
????/**?
?????*?获取Session工厂?
?????*?@return??SessionFactory?
?????*/??
????public?static?SessionFactory?getSessionFactory(){??
????????return?sessionFactory;??
????}??
????/**?
?????*?获取Session?
?????*?@return??????Session?
?????*/??
????public?static?Session?getSession(){??
????????return?sessionFactory.getCurrentSession();??
????}????
测试类部分代码:
public?static?void?main(String[]?args)?{
Session?session?=?HibernateUtil.getSession();//获取session
session.beginTransaction();//开始事务
User?user?=?(User)?session.get(User.class,?1);?
System.out.println(user.getName());
session.getTransaction().commit();//事务提交
session.close();
}2、openSession()打开一个新session
package?com.deptsystem.util;??
import?org.hibernate.Session;//hibernate3的??
import?org.hibernate.SessionFactory;??
import?org.hibernate.cfg.Configuration;??
/**?
?*?Hibernate的帮助类,用来获取Session?
?*
?*/??
public?class?HibernateUtils?{??
???private?static?SessionFactory?factory;??
???static{??
???????????try{??
????????????//读取hibernate.cfg.xml文件??
????????????Configuration?cfg=new?Configuration().configure();??
????????????//建立SessionFactory??
????????????factory=cfg.buildSessionFactory();??
???????????}catch(Exception?e){??
??????????????e.printStackTrace();???
???????????}??
???}????
??????//获得开启着的Session??
???public?static?Session?getSession(){??
???????return?factory.openSession();??
???}??
??????//关闭Session??
???public?static?void?closeSession(Session?session){??
???????if(session!=null){??
???????????if(session.isOpen()){??
???????????????session.close();??
???????????}??
???????}??
???}??
???public?static?SessionFactory?getSessionFactory(){??
???????return?factory;??
???}??
}测试类部分代码:
public?static?void?main(String[]?args)?{
Session?session?=?HibernateUtil.getSession();//获取session
session.beginTransaction();//开始事务
User?user?=?(User)?session.get(User.class,?1);?
System.out.println(user.getName());
session.getTransaction().commit();//事务提交
session.close();
}3、使用注意事项
????1)openSession和getCurrentSession的区别
? ?????????openSession必须关闭,currentSession在事务结束后自动关闭
? ?????????openSession没有和当前线程绑定,currentSession和当前线程绑定
????2)如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:
? ?????????a、如果是本地事务(jdbc事务)
???? <propertyname="hibernate.current_session_context_class">thread</property>
?? ????????b、如果是全局事务(jta事务)
?? ????<propertyname="hibernate.current_session_context_class">jta</property>
????????全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA 二阶段提交协议与“企业信息系统”(EIS) 或数据库进行交互。?
????????本地事务:在单个 EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。
Hibernate的sessionFactory不是可以获取session么,实际项目中也是通过它来得到的呀。
public List<UserInfo> showEmployee() {
return getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
String hql="from UserInfo";
Query query=session.createQuery(hql);
return query.list();
}
});
}
这样可以得session
好处就是节省资源,因为要多次对数据库操作,每次开一个session不觉得浪费资源么,所以用一个单子模式只开一个session,那个线程用,就给谁
实际项目 一般会用spring 来生成对象。
是框架集成使用的。
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....