hibernate中怎么得到session
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
这样有什么好处呢 展开
推荐于2016-03-28 · 知道合伙人软件行家
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或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。
是框架集成使用的。
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