------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

本篇博客将讲述,以优雅的方式创建session对象,我将会说明优点,并提炼成工具类

优点:

  1.无需手动关闭session

  2.提高了性能,不需要频繁的创建session对象

说明:

  虽然getCurrentSession()底层调用了openSession(),但是做了单例操作,所以性能更高,更安全

工具类:

package cn.dawn.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; /**
* Created by Dawn on 2018/5/30.
*/
public class SessionFactoryUtil {
private static Configuration configuration;//加载核心配置文件
private static SessionFactory factory;//单例对象 //在类加载的时候,加载静态代码块
static {
configuration=new Configuration().configure();//默认加载根目录下的hibernate.cfg.xml
factory=configuration.buildSessionFactory();
} //通过sessionfactory创建session
/*设置同步,保证线程安全*/
public static synchronized Session getCurrentSession(){
return factory.getCurrentSession();
/*不能直接使用,需要在核心配置文件中加入一个节点*/
/*<property name="current_session_context_class">thread</property>*/
}
}

另外需要在hibernate.hbm.xml中配置一个节点:

<property name="current_session_context_class">thread</property>

简单的使用案例:

package cn.dawn.day03;

import cn.dawn.day03.entity.Teacher;
import cn.dawn.util.SessionFactoryUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.util.List; /**
* Created by Dawn on 2018/5/25.
*/
/*分页*/
public class Test0120180530Page {
/*事物*/
Transaction tr=null;
/*session*/
Session session=null; @Test
/**
* 分页
*
* 01.查询总记录数
* 02.每页显示的数据
* 03.总页数
*/
public void t1Page(){
String hql="select count(*) from Teacher";//会返回Long类型
int counts=((Long)session.createQuery(hql).uniqueResult()).intValue();
/*页大小*/
int pageSize=2;
/*总页数*/
int totalPages=(counts%pageSize==0)?(counts/pageSize):(counts/pageSize+1);
/*显示第二页内容*/
int pageIndex=2;
hql="from Teacher";
Query query = session.createQuery(hql);;
/*从哪一条开始查*/
query.setFirstResult((pageIndex-1)*pageSize);
/*设置页大小*/
query.setMaxResults(pageSize);
List<Teacher> teachers = query.list();
for (Teacher t:teachers) {
System.out.println(t);
} } /*在执行之前加载配置,运行事物*/
@Before
public void beforeTest(){ /*使用工具类*/
/*创建session*/
session = SessionFactoryUtil.getCurrentSession();
/*创建事物*/
tr = session.beginTransaction();
} /*在执行之后,提交事物,关闭session*/
@After
public void afterTest(){
/*提交事物*/
/*tr.commit();*/
/*关闭session*/
/*session.close();*/
}
}

Hibernate-ORM:09.Hibernate中的getCurrentSession()的更多相关文章

  1. spring中使用Hibernate中的getCurrentSession报出:createQuery is not valid without active transaction

    1.错误信息 HTTP Status 500 - createQuery is not valid without active transaction type Exception report m ...

  2. Hibernate (ORM)

    1 框架体系结构 2 hibernate入门 2.1 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational: ...

  3. ORM和Hibernate的配置方式

    分层体系结构: 逻辑上一般分为三层:表述层(提供与用户交互的界面).业务逻辑层(实现各种业务的逻辑).数据库层(负责存放和管理应用的持久性业务数据). 物理上一般分为两层:物理层(每一层都运行在网络上 ...

  4. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  5. hibernate学习(三) hibernate中的对象状态

    hibernate对象的状态分为三种:  游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration   cfg=new Configuration().configure(); ...

  6. Hibernate之ORM与Hibernate

    ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...

  7. ORM框架Hibernate (一) 对DAO封装和抽象

    说明 前面已经给大家介绍了Struts这个框架,Struts是对Web项目的表示层进行了封装,而Hibernate是对Web项目中DAO层进行封装,也即是.NET中我们常用到的D层封装,即对访问数据库 ...

  8. hibernate里的generator中class =value介绍

    在*.hbm.xml必须声明的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识.<generator class="sequence ...

  9. wildfly 10上使用最新的 Hibernate ORM OGM

    ORM是关系型数据库连接:ogm是No sql数据库连接,Mongo, redis等. 1,下载ogm zip包,解压到wildfly_home\modules\system\layers\base, ...

  10. ORM与hibernate概述

    JDBC是什么? JDBC代表java数据库连接,并提供一组java API,用于java成许访问关系数据库.这些Java的API允许Java程序执行SQL语句,并与任何SQL兼容的数据库进行交互. ...

随机推荐

  1. 小故事学设计模式之Decorate: (二)老婆的新衣服

    老婆有一件蓝色的裙子和一件粉色的裙子, 不管怎么穿,她还是原来的老婆. 但是在软件里就不一定了, 如果把老婆比作一个class的话, 有一种做法是会因为增加了两个新的Property而继承出两个子类: ...

  2. 笔记本win8系统共享wifi上网方法

    华硕笔记本电脑,安装了win8系统,使用wifi上网,由于连接无线路由的机器太多,超过路由连接数上限,因此转为使用笔记本共享wifi方式给手机上网. 最终上网方式为: 笔记本网卡接入无线路由器上网,笔 ...

  3. Ubuntu adb device

    在ubuntu上经常出现系统无法识别android手机的情况,要解决这个问题可以用以下方法: 1. 执行 "android update adb", 这会创建"~/.an ...

  4. 动态规划(DP),类似LIS,FatMouse's Speed

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weig ...

  5. react中使用react-transition-group实现动画

    css动画的方式,比较局限,涉及到一些js动画的时候没法处理了.react-transition-group是react的第三方模块,借住这个模块可以更方便的实现更加复杂的动画效果 https://g ...

  6. maven的.m2文件夹

    安装完maven是没有.m2文件夹的. Maven缺省的本地仓库路径为${user.home}/.m2/repository 在linux中以.开头的文件夹都是隐藏的.当使用maven命令的时候,ma ...

  7. 【洛谷P3225】[HNOI2012]矿场搭建

    矿场搭建 题目链接 根据题意,发生事故时会有一个挖煤点坍塌, 只有当这个点是割点,会对图的连通性产生影响, 我们首先Tarjan一遍找到所有割点,将原图除去这些割点后, 遍历一遍,找出所有连通块,分三 ...

  8. 【luogu P4568 [JLOI2011]飞行路线】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4568 卡了一晚上,算是分层图最短路的模板.注意卡SPFA,所以我写了个SLF优化. 同时 AC400祭!~ ...

  9. C# String与StringBuilder (转载)

    1.什么时候用String?什么时候用StringBuilder? 字符串一旦创建就不可修改大小,所以对字符串添加或删除操作比较频繁的话.那就不要用String而用StringBuilder. 例如: ...

  10. EF执行SQL语句

    使用上下文中的Database.SqlQuery<对应的表名>(sql语句) var data = dbcenter.Database.SqlQuery<CcBusiFormview ...