• Hibernate为了提高性能,提供了缓存与快照机制。

它的缓存分为一级缓存与二级缓存。

Hibernate一级缓存:当一个事务中执行一次Sql语句时,就将返回的结果存储在Session中的Map集合中(当然,还有快照)。

  • 测试:(以下所有代码处于try/catch块中)
     Configuration config=new Configuration().configure();//configure()方法是加载src/hibernate.cfg.xml配置文件
SessionFactory sf=config.buildSessionFactory();
Session s=sf.openSession();//Session是高一级的对Connection的封装
Transaction tran=null;
try {
tran=s.beginTransaction(); //代码在此
tran.commit();
} catch (HibernateException e) {
if(tran!=null){
tran.rollback();
}
e.printStackTrace();
} finally{
s.close();
sf.close();
}
  • 查询:包括get(),load(),原生Sql,HQL,Criteria(比HQL更面向对象的一种查询方式)
        //1.get(),load()方法测试
User u=(User) s.get(User.class, 1);//第一次查询生成SQL语句,并将结果放入缓存
User u1=(User) s.get(User.class, 1);//第二次查询并无生成SQL语句,但结果取自缓存
p(u==u1);//true
//2.HQL查询
Query q=s.createQuery("from domain.User where id=1");
User u2=(User) q.uniqueResult();//第三次查询生成了SQL语句,但结果取自缓存
p(u2==u);//true
//3.原生Sql
SQLQuery q1=s.createSQLQuery("select * from User where id=1");
q1.addEntity(User.class);
User u3=(User) q1.uniqueResult();//第四次查询生成了SQL语句,但结果取自缓存
p(u3==u);//true
//4.Criteria查询
Criteria c=s.createCriteria(User.class);
c.add(Restrictions.eq("id", 1));
User u4=(User) q1.uniqueResult();//第五次查询生成了SQL语句,但结果取自缓存
p(u4==u);//true

总结查询:

  get(),load() 原生Sql,HQL,Criteria
Sql语句的缓存

X

查询对象的缓存
  • 增加:save(),persist()
            User user = new User();//对象的瞬态
user.setName("xiaobai");
user.setAge(121);
s.save(user);//对象的持久态
          s.persist(user);

这里两个方法的区别是:执行方法之前设置主键问题与执行方法之后返回主键问题。

1,persist(),把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。

2,save(), 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert。

                User u = new User();
u.setName("xiaobai");
u.setAge(121);
s.save(u);//插入数据库,并将对象瞬态转为持久态,将返回对象存入缓存
User u1=(User) s.get(User.class, u.getId());//这次查询没有生成SQL语句,结果取自Session的缓存
p(u1==u);//true
  • 删除:delete()
User u=(User) s.get(User.class, 10);//执行查询操作
s.delete(u);//将对象持久态转为游离态

当然,如果感觉为了删除一个数据,还的执行查询操作降低性能,可以这样:

User u=new User();
u.setId(5);
s.delete(u);
  • 更新:update()
User u=(User) s.get(User.class, 1);
u.setName("set");

但有时候,我们不需要执行s.update(对象)方法,这这涉及到对象的持久态一个特性(也有【快照】作用其中):

当对象为持久态时,当它更新数据时,框架会拿它与之前的快照作比较,若相同,则无动作;若不同,则自动更新至数据库。

//当然,也可以这么做
User u=new User();//对象的瞬态,不具备自动更新功能,需要我们手动update()
u.setAge(1);
u.setId(1);
u.setName("1");
s.update(u);
  • 总结:

有一点非常重要:在事务中虽然形成了Sql语句,但只有事务.commit()之后才会真正操作数据库。

Hibernate关于数据库的操作,需要弄清楚【缓存,快照,对象三态】等等些许东西。

对象三态:

* 瞬时态:和hibernate没关联,在数据库表中没有对应的id
* 持久态:和hibernate有关联,在数据库表中有对应的id---OID
* 游离态:和hibernate没关联,在数据库表中有对应的id

Hibernate总结(一)的更多相关文章

  1. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用

    问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...

  3. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  4. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  5. Hibernate中事务声明

    Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...

  6. spring applicationContext.xml和hibernate.cfg.xml设置

    applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  7. [原创]关于Hibernate中的级联操作以及懒加载

    Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...

  8. hibernate的基本xml文件配置

    需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...

  9. Maven搭建SpringMVC+Hibernate项目详解 【转】

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  10. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

随机推荐

  1. AMD规范与CMD规范的区别

    AMD规范与CMD规范的区别是什么?    在比较之前,我们得先来了解下什么是AMD规范?什么是CMD规范?当然先申明一下,我个人也是总结下而已,也是网上看到的资料,自己总结下或者可以说整理下而已,供 ...

  2. Viewport---响应式 Web 设计----在路上(13)

    什么是 Viewport? viewport 是用户网页的可视区域. viewport 翻译为中文可以叫做"视区". 手机浏览器是把页面放在一个虚拟的"窗口"( ...

  3. Spring学习记录(三)---bean自动装配autowire

    Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...

  4. 工作任务:模拟淘宝登录和购物车功能:使用cookie记录登录名,下次登录时能够记得上次的登录名,使用cookie模拟购物车功能,使用session记住登录信息并验证是否登录,防止利用url打开网站,并实现退出登录功能

    登入界面<% Cookie[] cks =request.getCookies(); String str=null; for(Cookie ck:cks) { if(ck.getName(). ...

  5. 读书笔记-you-don't-konw-js

    第一部分:作用域和闭包 不要满足于只是让代码正常工作,而是弄清楚为什么是这样 作用域是什么 定义的变量存储在哪里?程序是如何找到变量的?实现的 规则就是作用域 传统编译语言执行前的编译三步骤(p5) ...

  6. MongoDB 搭建副本集

    副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...

  7. iOS开发之使用XMPPFramework实现即时通信(三)

    你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...

  8. 【记录】SqlBulkCopy 跨数据库,表自定义导入

    使用场景: 一个数据库中的表数据,导入到另一个数据库中的表中,这两个表的表结构不一样,如果表结构一样的时候,导入非常简单,直接读取导入就行了,表结构不一样,就意味着需要加入一些判断,SqlBulkCo ...

  9. iOS 如何在整个屏幕中都能实现滑动返回的效果

    - (void)setupGetsInNav { UIGestureRecognizer *gesture = self.interactivePopGestureRecognizer; gestur ...

  10. 1Z0-053 争议题目解析330

    1Z0-053 争议题目解析330 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 330.What will be the end result of this set of RM ...