hibernate中怎么得到session

2025-03-19 20:05:16
推荐回答(5个)
回答1:

    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事务)

     thread

           b、如果是全局事务(jta事务)

       jta

        全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA 二阶段提交协议与“企业信息系统”(EIS) 或数据库进行交互。 

        本地事务:在单个 EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

回答2:

好处就是节省资源,因为要多次对数据库操作,每次开一个session不觉得浪费资源么,所以用一个单子模式只开一个session,那个线程用,就给谁

回答3:

Hibernate的sessionFactory不是可以获取session么,实际项目中也是通过它来得到的呀。

回答4:

实际项目 一般会用spring 来生成对象。
是框架集成使用的。

回答5:

public List 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