Hibernate小记录

       公司框架中用到的是Hibernate,简单的方法调用还是会用的,但涉及到底层的一些知识点就有些懵逼了,希望可以记录自己的学习过程
       开发流程中遇到bug,debugger后发现保存数据时其中一张表中数据未插入,但是插入时并没有报错,很疑惑。原因在于hibernate底层保存是根据实体类来保存,配置文件中设置了id为序列取值,后边保存的对象中id已经赋值,导致数据根本没有进行插入操作。
       判断代码中是否用到的是hibernate封装的操作方法,还是jdbc底层的,只需要看操作的对象是实体类还是数据库表。若操作实体类则用到的方法是hibernate封装的方法。
Hibernate简单介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate的优缺点
1 优点
程序更加面向对象;
提高了生产率;
方便移植(修改配置文件);
无侵入性。
注:简单理解,所谓侵入性,是指它没有侵入hibernate任何的API。完全采用普通的Java对象(POJO),而不必继承Hibernate的某个基类,或实现Hibernate的某个接口。
例如 : A是侵入性的,B代码中使用A,那么如果以后不用A了(用另外一个工具代替),必须修改B的代码。反之,如果A是非侵入性的,B不用A,用C了,代码不需要改,改改配置文件什么的,就可以了
2 缺点
效率比JDBC略差;
不适合批量操作。
只能配置一种关联关系
hibernate工作原理
配置好hibernate的配置文件和与类对应的配置文件后,启动服务器
服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表或者和表建立好映射关系
通过实例化的Configuration对象就可以建立sessionFactory实例,进一步,通过sessionFactory实例可以创建 session对象
得到session之后,便可以对数据库进行增删改查操作了,除了比较复杂的全文搜索外,简单的操作都可以通过hibernate封装好的 session内置方法来实现
此外,还可以通过事物管理,表的关联来实现较为复杂的数据库设计
优点:hibernate相当于java类和数据库表之间沟通的桥梁,通过这座桥我们就可以做很多事情了
hibernate初始化
1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的读取并解析映射信息
3.通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory
4.Session session = sf.openSession();//打开Sesssion
5.Transaction tx = session.beginTransaction();//创建并启动事务Transation
6.persistent operate操作数据,持久化操作
7.tx.commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
Hibernate的3种对象状态
1 临时状态(或者叫瞬时状态Transient)
由new命令开辟内存空间的java对象,例如:

User user=new User();

临时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系。
2 持久状态(Persistent)
该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.通过session的 get()、load() 等方法获得的对象都是持久对象。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的。
3 游离状态(或者叫脱管状态Detached)
当与某持久对象关联的 session 被关闭后,该持久对象转变为游离对象.当游离对象被重新关联到session上 时,又再次转变成持久对象(在Detached其间的改动将被持久化到数据库中)。游离对象拥有数据库的识别值,但已不在持久化管理范围之内。
Hibernate对象状态转换
在这里插入图片描述
对象状态转换说明
临时状态或者瞬时状态 (transient)

  • 不处于Session 缓存中,存在内存中
  • 数据库中没有对象记录

Java如何进入临时状态

  • 通过new语句刚创建一个对象时
  • 当调用Session 的delete()方法,从 Session 缓存中删除一个对象时。

持久化状态(persisted)

  • 处于Session 缓存中。
  • 持久化对象数据库中有对象记录。
  • Session 在特定时刻会保持二者同步。

Java如何进入持久化状态

  • Session 的save()把临时 —>>> 持久化状态。
  • Session 的load(),get()方法返回的对象。
  • Session 的find()返回的list集合中存放的对象。
  • Session 的update(),saveOrupdate()使游离 —>>> 持久化。

游离状态或者托管状态(detached)

  • 不再位于 Session 缓存中.
  • 游离对象由持久化状态转变而来,数据库中可能还有对应记录。

Java如何进入持久化状态 —>>> 游离状态

  • Session 的close()方法
  • Session 的evict()方法,从缓存中删除一个对象,提高性能,少用。

Hibernate缓存
1.为什么需要缓存
Hibernate是一个持久层框架,经常访问物理数据库。为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。

2.Hibernate缓存分类
Hibernate一级缓存又称为 Session 的缓存:
Session内置不能被卸载
Session的缓存是事务范围的缓存
Session对象的生命周期通常对应一个数据库事务或者一个应用事务

Hibernate二级缓存又称为“SessionFactory的缓存:
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。

3.Hibernate缓存查询机制
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;
查不到,如果配置了二级缓存,那么从二级缓存中查;
如果都查不到,再查询数据库,把结果按照ID放入到缓存
删除、更新、增加数据的时候,同时更新缓存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值