hibernate中怎么得到session

有一种叫threadlocal是不是实际项目中都是用它得到session呢publicstaticSessiongetSession()throwsHibernateEx... 有一种叫 threadlocal 是不是实际项目中 都是用它得到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 · 知道合伙人软件行家
青鸟中关村专家
知道合伙人软件行家
采纳数:1734 获赞数:8440
就职于北大青鸟中关村,自2004年踏入北大青鸟这个行业,已经有11年工作经验和8年的培训经验,寓教于乐

向TA提问 私信TA
展开全部

    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或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

lgyt34
2010-03-16 · TA获得超过215个赞
知道小有建树答主
回答量:232
采纳率:0%
帮助的人:199万
展开全部
好处就是节省资源,因为要多次对数据库操作,每次开一个session不觉得浪费资源么,所以用一个单子模式只开一个session,那个线程用,就给谁
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
自然大视界
2010-03-16 · TA获得超过311个赞
知道小有建树答主
回答量:495
采纳率:0%
帮助的人:137万
展开全部
Hibernate的sessionFactory不是可以获取session么,实际项目中也是通过它来得到的呀。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qcxangel
2010-03-16 · TA获得超过214个赞
知道答主
回答量:142
采纳率:0%
帮助的人:104万
展开全部
实际项目 一般会用spring 来生成对象。
是框架集成使用的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月光光1234
2010-03-16 · TA获得超过322个赞
知道小有建树答主
回答量:303
采纳率:0%
帮助的人:114万
展开全部
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式