资讯专栏INFORMATION COLUMN

Hibernate快速了解

selfimpr / 1918人阅读

摘要:和就是针对的一级缓存的处理。事务对数据的操作都是封装在事务当中的,并且默认是非自动提交的方式。所以对保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。

ORM

全称Object/Relationship Mapping(对象/关系映射)

为何引入ORM

Java、C++等许多语言是面向对象的编程思想,但是底层数据库往往是关系型数据库,为了往数据库中插入数据,需要编写相应的sql语句。比如向一张学生表中插入一条数据(包含学生的基本信息:姓名、年龄、家庭住址等)

insert into students values(1,"张三丰","16","男","1977-4-3","武当山屠龙馆")


这种在程序中大量插入SQL语句的方式有很多弊病,因为对于SQL语句来说,存在以下问题:

不同数据库使用的SQL语句不同,比如mysql、SQL Server(微软的产品)

同样的功能,在不同数据库中实现方式不同。因为不同数据库产品封装的不一样

因此,如果程序中写入大量SQL语句,将对程序的移植、维护带来很多麻烦。ORM就是这样诞生的,其目的是让程序员抛弃在程序中直接书写SQL的思想,完全使用面向对象的思想来开发软件。Hibernate就是一种ORM框架

关系数据库:可以简单的理解为二维数据库。复杂来说,是指采用了关系模型来组织数据的数据库(关系模型是1970年由IBM研究员E.F.Codd博士首先提出的,并逐渐发展为数据库架构的主流模型),一般而言,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表格和它们之间的联系组成的一个数据组织

题外话: 经常看到除了关系型数据库,还有一种非关系型数据库,其实这是一种误解。其英文为:NoSQL(全称:Not Only SQL),所以叫它不仅仅是SQL或者超关系型数据库都行,不知道为什么就翻译成了非关系型数据库。毕竟这个“非”字导致了很多理解困难
Hibernate

Hibernate是Java领域的一款开源ORM框架技术,对JDBC进行了轻量级的对象封装

执行流程

Session(会话)

不建议直接使用jdbc的connection来操作数据库,而是使用session,可以简单认为,session就是操作数据库的对象。
要想把数据保存在关系型数据库中,需要调用session的各种方法,如:save()、update()等

如何获取session对象

通常有两种方法,这两种方法都是sessionFactory中的
1) openSession
2) getCurrentSession
如果使用getCurrentSession,需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
thread
如果是全局事务(jta事务)
jta

openSession和getCurrentSession

getCurrentSession在事务提交或者回滚之后会自动关闭;而openSession需要手动关闭,如果未进行手动关闭,多次之后会导致连接池溢出

openSession每次都会创建新的session对象,getCurrentSession则使用先用的session对象

session操作

hibernate会把符合条件的数据寄存到内存上,那么也就存在一个对内存的管理,而session是有一级缓存(强制默认开启),其目的是为了减少查询数据库的时间,提高效率,一级缓存的生命周期和session是一样的。session.flush()和session.clear()就是针对session的一级缓存的处理。
简单来说:

session.flush()的作用就是将session缓存(在内存里)中的数据与数据库同步。

session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)

session.evict(obj)的作用就是将指定的obj缓存对象进行清除

Flush方法

可以通过flush方法强制进行从内存到数据库的同步,主要分为了两步:清理缓存,执行SQL。例如:

public void testFlush(){  
    Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
    session.beginTransaction();  
    Teacher t = (Teacher) session.get(Teacher.class, 3);  
    t.setName("yyy");  
    session.flush();//有flush会执行2次UPDAE,没有会只执行一次  
    t.setName("yyyyy");  
    session.getTransaction().commit();  
}  

Flush方法是可以设置的,也就是 fulsh 什么时候执行是可以设置的,在session.beginTransaction 代码前设置 FlushMode

session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL);

这里 FlushMode 有 5 个值可选:

Always: 任何代码都会 Flush

AUTO: 默认方式 – 自动

Commit: COMMIT 时

Never: 始终不

MANUAL: 手动方式

设置 FlushMode 有个好处是可以节省开销,比如默认 session 只做查询时,就可以不让他与数据库同步了。

注意:执行完session.flush()时,并不意味着数据就肯定持久化到数据库中的,因为事务控制着数据库,如果事务提交失败了,缓存中的数据还是照样会被回滚的。
transaction(事务)

hibernate对数据的操作都是封装在事务当中的,并且默认是非自动提交的方式。所以对session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
如果想让hibernate像JDBC那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置为自动提交事务模式(注意:通常不推荐这么做)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68240.html

相关文章

  • 猫头鹰的深夜翻译:为什么要使用Spring Boot?

    摘要:初次使用的人往往会困惑,不知道该使用哪种方法。目前来说,团队推荐使用基于的方法来提供更高的灵活性。配置,从而在应用启动时执行脚本来初始化数据库。目前为止我们没有任何消息需要配置,所以只在文件夹中创建一个空的文件。将配置为,它包含的上下文。 前言 spring是一个用于创建web和企业应用的一个很流行的框架。和别的只关注于一点的框架不同,Spring框架通过投资并组合项目提供了大量的功能...

    Jaden 评论0 收藏0
  • Spring/Hibernate 应用性能优化的7种方法

    摘要:对于大多数典型的企业应用而言,其性能表现几乎完全依赖于持久层的性能。速成法使用批处理对于批处理程序,驱动程序提供了旨在减少网络来回传输的优化方法。速成法检查错误的提交间隔如果你使用批处理程序,提交间隔会对性能造成十倍甚至百倍的影响。 对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能。此篇文章中将介绍如何确认应用是否受数据库约束,同时...

    lavor 评论0 收藏0
  • Spring Boot - 表单校验(JSR303&Hibernate Validator)

    摘要:初步使用主要使用注解的方式对进行校验,第一个例子在需要校验的字段上指定约束条件然后在中可以这样调用,加上注解即可。如果校验失败,默认会返回框架的出错信息。指定到的分组名会全部进行校验,不指定的不校验。 Spring Boot - 表单校验(JSR303&Hibernate Validator) 回顾 Spring Boot - 初识 Hello World Spring Boot -...

    tinyq 评论0 收藏0
  • 深入了解数据校验:Bean Validation 2.0(JSR380)

    摘要:可能有人认为数据校验模块并不是那么的重要,因为硬编码都可以做。我以数据绑定为引子引出了数据校验这一块,是想表明它的重要性。关于数据校验这块,最新的是,也就是我们常说的。 每篇一句 吾皇一日不退役,尔等都是臣子 对Spring感兴趣可扫码加入wx群:Java高工、架构师3群(文末有二维码) 前言 前几篇文章在讲Spring的数据绑定的时候,多次提到过数据校验。可能有人认为数据校验模块...

    wangtdgoodluck 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<