1、获取session方式二:
传递session的问题:
绑定到本地线程
2、开发流程:
2.1、开启事务(支持本地线程绑定)
<property name="hibernate.current_session_context_class">thread</property>
2.2、获取session
在工具类中获取session:
//获取session方式二:使用这个session必须开启事务
public static Session getCurrentSession(){
//受线程绑定,即在多线程下,线程是安全的
return sessionFactory.getCurrentSession();
}
2.3、开发:
必须开启事务
不用关闭连接(线程绑定的,线程结束,自动关闭)
//条件查询(命名占位符)session第二种方式
public void findByIdHqlByCurrentSession(Integer uid){
//得到session
Session session = YtUserUtils.getCurrentSession();
//开启事务
Transaction transaction = session.beginTransaction();
//hql
String hql = "from UserinfoEntity where uid =:uid";
Query <UserinfoEntity> query = session.createQuery(hql, UserinfoEntity.class);
//可以设置事务为只读
query.setReadOnly(true);
//设置参数值
query.setParameter("uid",uid);
//获取单个对象
UserinfoEntity userinfoEntity = query.uniqueResult();
System.out.println(userinfoEntity.getUid() + "\t" + userinfoEntity.getUserName() + "\t" + userinfoEntity.getUserPass());
//提交事务
transaction.commit();
//关闭链接
session.close();
}
2.4、扩展(对比两个session)
getCurrentSession:多线程安全(必须开启事务)
session:多线程不安全
//对比两个session
public void textSession(){
// 在同一个线程内,用 YtUserUtils.getCurrentSession()得到的是一样的session
Session currentSession1 = YtUserUtils.getCurrentSession();
System.out.println(currentSession1);
Session currentSession2 = YtUserUtils.getCurrentSession();
System.out.println(currentSession2);
System.out.println("currentSession对比结果:");
System.out.println(currentSession1 == currentSession2);
//每次都是新session
Session session = YtUserUtils.openSession();
Session session2 = YtUserUtils.openSession();
System.out.println("openSession对比结果:");
System.out.println(session == session2);
}