一.持久化类

1.持久化标识OID
     数据库中叫做主键,对应实体的ID属性即为OID;Hibernate通过OID区分两个对象是否为同一对象;OID的生成一般交由程序自动处理;

2.持久化类
     概念:持久化类为可以操作数据库的实体类;
         持久化类 = 实体类 + 映射文件(实体类名.hbm.xml)

3.编写规则:
     (1).类需使用public修饰;
     (2).实现序列化接口;(public class User implements Serializable{....})
     (3).类不能使用final修饰,否则无法构造代理对象;
     (4).属性需使用private修饰,并提供public修饰的getter/setter方法;
     (5).需添加OID属性;
     (6).使用包装类(Long,Double,Integer,Character...)修饰属性
     (7).无参构造需使用public修饰,便于通过反射创建对象;

4.三种状态:
     区分要点:(1)是否存在OID;(2)是否被session管理;
     i.瞬时态:无ID,无session;
     ii.持久态:有ID,有session;该状态的对象在属性发生变化时,自动更新数据库,而不用调用update方法;
     iii.游离态(脱管态):有ID,无session;

二.主键(OID)生成策略

1.分类:
     自然主键:把具有业务含义的字段作为主键;弊端是实际业务中该字段有可能重复,一旦重复就要修改模型,重新定义主键,增加了维护数据库的难度;
     代理主键:把不具备业务含义的字段作为主键,一般取名为"ID",且一般为整型,节省数据库空间;主键生成策略只对代理主键有效!!

2.生成策略:6种
     increment:自动增长,仅支持数字类型(不推荐使用);原理为先查询数据库表中最大ID值,然后再此基础上加1.如果有用户使用过该ID,后注册用户可以再次使用,导致数据重复问题;
     identity:自动增长,仅支持数据类型,原理为调用了数据库的增长方式.使用该策略之前应确定所使用的数据库支持自动增长,如mysql;
     sequence:原理是通过调用数据库生成序列标识符,前提是确定数据库支持序列,如oracle;
     native:根据数据库对自动生成表示符的能力来选择identity或sequence,最为常用;
     uuid:采用128位的UUID算法来生成标识符,然后被编码为32位的十六进制字符串,由于字符串占用数据库空间较整型较大,也不流行;
     assigned:手动指派(java程序指定);如果不在映射关系文件中配置id元素的generator属性,则默认使用该策略;

3.配置生成策略:在实体类包下的映射关系文件(实体类.hbm.xml)中

  1     <class name="实体类全限定名" table="数据库表名">
2 <id name="OID名" column="数据库表字段名">
3 <generator class="native"></generator>
4 </id>
5 ...............
6 </class>

三.缓存机制

1.缓存:
     内存中的一块临时区域,用来提高访问效率,hibernate的缓存机制主要用于提高查询效率;

2.一级缓存:
     (1)定义:session级别的缓存(与session的生命周期一致),程序自带,不可卸载,由一系列的java集合(Map)构成;
     (2)存取数据的时机:
         i.调用save/update方法时,首先保存到数据库,再放入缓存;
         ii.调用get方法时,先从缓存查找,没有话再从数据库中查找,然后放入缓存;
     (3)验证一级缓存的存在:两次查找同一对象,第一次查询会发送sql语句,第二次没有发送;
     (4)内部结构:
         存在缓存区和快照区;快照区存放的是缓存区数据的副本,程序员不可修改;程序员进行CRUD操作时其实是在操作缓存区,在提交事务时,hibernate会比较两块区域数据的一致性,若不一致,则参照缓存数据修改数据库,并存入快照区一份.

3.二级缓存:
     SessionFactory级别的缓存;插件形式,需要配置并导入jar包,已被redis等取代;

四.事务管理
     1.概念:
         逻辑上的一组最小操作单元,特点是同时成功或失败,目的是保证操作的完整性和安全性;
     2.特性:
         原子性:最小操作单元,不可分割;
         一致性:操作前后的数据保持一致;
         隔离性:多个线程之间的事务互不影响;
         持久性:事务提交后,存储至数据库,不可更改;
     3.不考虑隔离性的前提下,会出现的问题
         脏读/不可重复读/虚读
     4.解决以上问题:设置隔离级别
         read uncommited:不解决任何问题 1
         read commited:解决脏读问题 2  oracle的默认隔离级别
         repeatable read:解决脏读和不可重复读的问题 4 mysql的默认隔离级别
         serializable:都可以解决,但是变为单线程,效率低 8
     5.hibernate设置隔离级别
         在核心配置文件(hibernate.cfg.xml)中,添加以下语句:

  1         <hibernate-configuration>
2 <session-factory>
3 <property name="hibernate.connection.isolation">4</property>
4 ............
5 </session-factory>
6 </hibernate-configuration>

6.事务控制在service层
         (1)在核心配置文件(hibernate.cfg.xml)中,添加以下语句:

  1         <hibernate-configuration>
2 <session-factory>
3 <property name="hibernate.current_session_context_class">thread</property>
4 ............
5 </session-factory>
6 </hibernate-configuration>

(2)使用factory的getCurrentSession方法获取session对象
         (3)使用与当前线程绑定的session对象的时候,不用手动关闭

Hibernate笔记2的更多相关文章

  1. 框架Hibernate笔记系列 基础Session

    标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...

  2. hibernate笔记--cascade级联以及inverse属性

    cascade : 不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例, ...

  3. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  4. Hibernate笔记一

    背景 jdbc的优缺点 A:直接操作底层,提供了简单,便捷的访问数据库方法,跨平台比较强,灵活,可以写很多赋值的SQL语句:是最底层的数据库操作,所以效率比较高,Sql语句可以自己选择写,采用效率最高 ...

  5. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  6. hibernate笔记--缓存机制之 一级缓存(session缓存)

    一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...

  7. hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

    前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...

  8. hibernate笔记--继承映射关系的三种实现方式

    单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...

  9. hibernate笔记--单(双)向的多对多映射关系

    在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...

  10. hibernate笔记--基于主键的单(双)向的一对一映射关系

    上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...

随机推荐

  1. C++经典题目:约瑟夫环问题

    问题描述: 有n个人围成一圈,顺序排号.从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号. 分析: 首先由用户输入人数n,然后对这n个人进行编号[因为如果不编号的话 ...

  2. Java对象在内存中的状态

    可达的/可触及的 Java对象呗创建后,如果被一个或者多个变量引用,那就是可达的,即从根节点可以触及到这个对象. 其实就是从根节点扫描,只要这个对象在引用链中,那就是可触及的. 可恢复的 Java对象 ...

  3. swiper实现左右滑动图片

    ref:http://www.swiper.com.cn/usage/index.html help:https://segmentfault.com/a/1190000002962202 src: ...

  4. 3. 文件上传靶机实战(附靶机跟writeup)

    upload-labs 一个帮你总结所有类型的上传漏洞的靶场 文件上传靶机下载地址:https://github.com/c0ny1/upload-labs   运行环境 操作系统:推荐windows ...

  5. HDU 5242 Game (贪心)

    题意:给定一棵树,要求从根结点1走k次,每次都是到叶子结点结束,把走过的所有的结点权值加起来,最大是多少. 析:先把每个结点到根结点的路径之和求出来,然后按权值从大到小排序,然后每次把路径中的权值求出 ...

  6. 如何解决Failed to start component [StandardEngine[Catalina].StandardHost[127.0.0.1].StandardContext[]]问题

    调试web项目,项目部署到tomcat,报如下错误: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleExc ...

  7. e.key && e.which && e.keyCode

    官方推荐用e.key来描述状态码,其他两种属性可能会在未来被废弃. 且key,keyCode和which 为只读属性   但是会有浏览器兼容性的问题,可以采用如下代码:   let key = ''; ...

  8. Unity3D 脚本模板修改方法

    默认情况下,在Unity中创建C#脚本都会默认生成以下代码模板. using System.Collections; using System.Collections.Generic; using U ...

  9. ASP.NET MVC 小牛之旅4:ASP.NET MVC的运行生命周期

    ASP.NET MVC的运行生命周期大致分成三大过程:(1)网址路由对比. (2)运行Controller与Action. (3)运行View并回传结果. 4.1网址路由对比 当iis收到http请求 ...

  10. 一套简单的web即时通讯——第二版

    前言 接上一版,这一版的页面与功能都有所优化,具体如下: 1.优化登录拦截 2.登录后获取所有好友并区分显示在线.离线好友,好友上线.下线都有标记 3.将前后端交互的值改成用户id.显示值改成昵称ni ...