10分钟解决Hibernate的事务管理,Hibernate当中要设置事务的隔离级别
发布日期:2021-06-29 15:01:36
浏览次数:3
分类:技术文章
本文共 8207 字,大约阅读时间需要 27 分钟。
一、事务
1、什么是事务:
事务:事物指的是逻辑上的一组操作,组成这一组操作的逻辑单元要么全成功,要么全失败
2、事务的特性:
(1)原子性:代表事务不可分割。
(2)一致性:代表事务执行的前后,数据的完整性要保证一直。 (3)隔离性:代表的是一个事务执行的过程当中,不应该受到其他事务的干扰。 (4)持久性:代表一个事务执行完成后数据就持久到数据库当中(提交或回滚)。3、如果我们不考虑事务的隔离性,就会引发一些安全性的问题
(一)读的问题
(1)脏读:一个事务读到另外一个事务未提交的数据 (2)不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在前一个事务多次查询结果不一致 (3)虚度/幻读:一个事务读到另外一个事务已经提交的但是insert的数据,导致在前一个事务当中多次查询的结果不一致 (二)写的问题 (1)引发两类丢失更新4、读问题的解决
(一)设置事务的隔离级别
1、Read uncommitted:未提交读–以上的读问题都会发生 2、Read commited:解决脏读,但是不可重复读和虚读有可能发生(Oracle默认隔离级别) 3、Repeatable read:解决脏读和不可重复读,但是虚读是有可能发生的(MySQL默认隔离级别) 4、Serializable:解决所有的读问题(不能有事物的并发)(安全性高效率低)二、Hibernate当中要设置事务的隔离级别
核心配置文件hibernate.cfg.xml当中配置对应的属性 4是mysql的默认隔离级别 8是Oracle的默认隔离级别三、Service层事务
1、Hibernate如何解决Service的事务管理
2、使用getCurrentSession获取当前线程的session对象
(1)改写工具类
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;/* Hibernate的工具类*/public class HibernateUtils { public static final Configuration cfg; public static final SessionFactory sf; static { cfg = new Configuration().configure(); sf = cfg.buildSessionFactory(); } public static Session openSession() { return sf.openSession(); } public static Session getCurrentSession() { return sf.getCurrentSession(); }}
4
(2)配置完成(hibernate的核心配置文件当中)
thread
getCurrentSession获取当前线程的session对象,创建session对象之后不需要调用close方法,在线程结束的时候会自动将session关闭
(3)测试类package com.itzheng.hibernate.demo01;import org.hibernate.Session;import org.hibernate.Transaction;import org.junit.Test;import com.itzheng.hibernate.utils.HibernateUtils;/* * 测试当前线程绑定的Session */public class HibernateDemo04 { @Test public void demo01() { //会按照配置的好的事务处理方式去存储数据 Session session = HibernateUtils.getCurrentSession();//保证每一个对象在调用该方法的时候都使用的是同一个session Transaction transaction = session.beginTransaction(); Customer customer = new Customer(); customer.setCust_name("王西"); session.save(customer); transaction.commit(); //session.close();不需要二次关闭session。因为在当前线程结束的时候就会关闭session对象,也就缓存 }}
Hibernate其他API(解决事务当中的问题)
以下API在运行的时候需要配置好核心文件当中
com.mysql.jdbc.Driver jdbc:mysql:///hibernate_day02 root root org.hibernate.dialect.MySQLDialect true true update org.hibernate.connection.C3P0ConnectionProvider 5 20 120 3000 4 thread
以及准备好对应的工具类
public class HibernateUtils { public static final Configuration cfg; public static final SessionFactory sf; static { cfg = new Configuration().configure(); sf = cfg.buildSessionFactory(); } public static Session openSession() { return sf.openSession(); } public static Session getCurrentSession() { return sf.getCurrentSession(); }}
一、Query
Query接口用于接收HQL,查询多个对象。
HQL:Hibernate Query Language :Hibernate查询语言。这种语言与SQL的语法及其类似,是一个面向对象的查询语言。1、查询所有表当中信息
public class HibernateDemo5 { @Test // Query public void demo01() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session活动Query接口 String hql = "from Customer"; Query query = session.createQuery(hql); List2、查询指定字符的数据(条件查询)list = query.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }}
/* * Hibernate的其他的API */public class HibernateDemo5 { @Test // Query public void demo01() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session活动Query接口 // String hql = "from Customer"; String hql = "from Customer where cust_name like ?"; Query query = session.createQuery(hql); query.setParameter(0, "王%"); List分页查询list = query.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }}
/* * Hibernate的其他的API */public class HibernateDemo5 { @Test // Query public void demo01() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session活动Query接口 //分页查询 String hql = "from Customer"; Query query = session.createQuery(hql); //设置分页 query.setFirstResult(0);//相当于MySQL当中limit的第一个参数 query.setMaxResults(3); //query.setParameter(0, "王%"); List改变初始值list = query.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }}
@Test // Query public void demo01() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session活动Query接口 //分页查询 String hql = "from Customer"; Query query = session.createQuery(hql); //设置分页---》会根据不同的数据库切换SQL语句 query.setFirstResult(3);//相当于MySQL当中limit的第一个参数 query.setMaxResults(3); //query.setParameter(0, "王%"); Listlist = query.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }
二、Criteria
Criteria:QBC(Query By Criteria);
更加面向对象的一种查询方式。@Test // Criteria public void demo02() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session获得Criteria接口 Criteria criteria = session.createCriteria(Customer.class);// 返回 List条件查询list = criteria.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }
@Test // Criteria public void demo02() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session获得Criteria接口 Criteria criteria = session.createCriteria(Customer.class);//先获取到criteria的Customer对象 //criteria.add(Restrictions.like("cust_name", "王%"));//设置对应的查询的条件 criteria.add(Restrictions.like("cust_name", "王",MatchMode.START));//在这里上下这两种设置条件的方式实现的功能一致 Listlist = criteria.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }
分页查询
@Test // Criteria public void demo02() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session获得Criteria接口 /* * Criteria criteria = session.createCriteria(Customer.class);// 返回 * List修改初始值list = criteria.list(); */ Criteria criteria = session.createCriteria(Customer.class);//先获取到criteria的Customer对象 //criteria.add(Restrictions.like("cust_name", "王%"));//设置对应的查询的条件 criteria.add(Restrictions.like("cust_name", "王",MatchMode.START));//在这里上下这两种设置条件的方式实现的功能一致 criteria.setFirstResult(0); criteria.setMaxResults(3); List list = criteria.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }
@Test // Criteria public void demo02() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); // 通过Session获得Criteria接口 /* * Criteria criteria = session.createCriteria(Customer.class);// 返回 * Listlist = criteria.list(); */ Criteria criteria = session.createCriteria(Customer.class);//先获取到criteria的Customer对象 //criteria.add(Restrictions.like("cust_name", "王%"));//设置对应的查询的条件 criteria.add(Restrictions.like("cust_name", "王",MatchMode.START));//在这里上下这两种设置条件的方式实现的功能一致 criteria.setFirstResult(3); criteria.setMaxResults(3); List list = criteria.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }
三、SQLQuery
SQLQuery用于接收一个SQL语句。如果是特别复杂的使用SQL
@Test // createSQLQuery public void demo03() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); SQLQuery query = session.createSQLQuery("select * from cst_customer"); query.addEntity(Customer.class);//设置查询返回时返回对象的元素 Listlist = query.list(); for (Customer customer : list) { System.out.println(customer); } transaction.commit(); }
转载地址:https://code100.blog.csdn.net/article/details/105752807 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月03日 17时59分46秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
在图像变换中用最小二乘法求解仿射变换参数
2019-04-29
软件包应用分享|基于RT-Thread的百度语音识别(一)
2019-04-29
12月8日 RCEA - RT-Thread能力认证考试考前通知
2019-04-29
论坛热贴 | RT-Thread音频驱动开发(一)
2019-04-29
基于 Keil MDK 移植 RT-Thread Nano
2019-04-29
【报名截至今晚】12月14日深圳嵌入式与音频开发专题会议预告
2019-04-29
移植 RT-Thread Nano 到 RISC-V
2019-04-29
软件包应用分享|基于RT-Thread的百度语音识别(二)
2019-04-29
在 RT-Thread Nano 上添加控制台与 FinSH
2019-04-29
一站式开发工具:RT-Thread Studio 正式发布
2019-04-29
留言有礼|谢谢你悄悄点了小星星,让我们跃居GitHub RTOS Star榜第一
2019-04-29
功能更新!C 函数也能在 MicroPython 中被调用啦
2019-04-29
东软载波携ES32+RT-Thread走进海尔集团
2019-04-29
今晚8点直播预告:RT-Thread Studio等相关主题答疑
2019-04-29
物联网 20 年简史大揭秘!
2019-04-29
开源项目|RT-Thread 软件包应用作品:水墨屏桌面台历
2019-04-29
珠联璧合!基于i.MX RT和RT-Thread的物联网云接入方案
2019-04-29
基于RTT-MicroPython制作自带BGM的新型肺炎晴雨表
2019-04-29