一、主键生成策略

  1)主键分类:1.自然主键:主键本身就是表中的某一个字段,实体中的一个具体属性,对象本身唯一的特性。

          例如:创建一个学生,把其身份证号设为主键

         2.代理主键:本身不是表中的一个必须的字段,

          例如:创建一个学生,设置sid为主键。

           实际开发中,尽量使用代理主键。

  2)主键生成策略:在使用代理主键时,尽量自动生成主键,不让用户手动输入。

           在hibernate中,为了减少程序的编写,内部提供了多种主键生成策略

          1.increment:

            1.1自动增长策略:是适用于整型(long , short,int )

            1.2原理:首先发送一条语句,select max(id) from 表,然后加一。即查询最大id,然后进行加1。

            1.3在单线程中使用,不要在多线程中使用。

          2.identify

            2.1自动增长:是适用于整型(long , short,int )

            2.2原理:使用的是数据库底层的增长策略,适用于有自动增长的数据库,如mysql。

            2.3多线程安全。

          3.uuid 

            3.1适用于字符串类型的主键,使用hibernate中随机生成字符的主键。

          4.native

            4.1 自动增长,会根据所采用的数据库类型,自动变成identify(masql)或sequence(oracle)

          5.assigned

             hibernate不会帮你管理主键,需要手动调用,或通过程序生成。

          一般开发中使用uuid与native。

二、持久化

   1)什么是持久化:将内存中的一个对象存储到数据库中的过程。

   2)什么是持久化类:一个java类与数据库类建立的映射关系(java类+映射文件)

   3)持久化类编写规则:

      1.对持久化类提供一个无参的构造方法(一个类,如果没有构造方法,默认存在一个无参构造方法,如果重写了,则不会生成无参构造方法)。

        因为其内部通过反射创建对象,没有构造方法就无法创建对象。

      2.对内部私有的字段,必须提供get,set方法。(否则,hibernate无法获取对象的值)

      3.持久化类中提供一个oid与数据库中的主键对应。

      4.持久化类中的属性尽量使用包装类型(包装类型默认值是null,基本数据类型为数字)

      5.持久化类不能使用final来修饰。

三、持久化类的划分

  1)hibernate为了更好的管理持久化类,将持久化类分为三种状态。

    1.瞬时态:没有唯一的oid,没有被session管理。

    2.持久态:有唯一oid,被session管理。

    3.游离态/托管态/离线态:有唯一oid,但是没有被session管理

  2)三种状态划分:

     1.瞬时态:刚被new出来,还没有设置id,没有被session管理。

     2.持久态:已经有id了,调用session方法,把对象给session才被session管理。

          当对象处于持久态时,可以自动更新数据库。

     3.游离态:把session关闭时,对象处于游离态。

   @Test
public void test3(){
/*直接创建对象修改:如果没有指定其他字段,会把其他字段设为null*/
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
//更新操作
customer customer = new customer();//瞬时态
customer.setCust_id(1L);
customer.setCust_name("wzh");
session.update(customer);//持久态
customer.setCust_name("123");//处于持久态的对象具有更新数据库的能力
transaction.commit();
session.close();//游离态
HibernateUtil.sessionFactory.close();
}

      三种状态相互转换:

四、一级缓存

  1)什么是缓存:是一种优化方式,将数据存入内存中,使用的时候,直接从缓存中获取,不用直接到存储源(数据库)中获取。

      一级缓存:hibernate自带

      二级缓存:现在一般使用radis,不使用其自带的。

  2) 一级缓存:1.session级别的缓存,

         2.声明周期与session一致,一级缓存由session中的一系列集合构成。

         3.是自带的,不可卸载。(二级缓存是sessionFactory级别的)

  3)一级缓存的特点:查询更新是先检查缓存中有没有相应数据,有则不会查询数据库,没有就查询数据库,并把查询到的记录同步到缓存。当调用session.close方法时,缓存清空。

  4)一级缓存内部结构:

     快照区:使用id进行查询数据库时,将查询的结果放到session的一级一级缓存中,同时复制一份数据,放置到session的快照中。

         当使用tr.commit()时,同时清理session的一级缓存(flush)

         当清理session一级缓存时,会使用Oid判断一级缓存中的对象与快照中的对象进行比较,如果两个对象中,对象属性发生变化,则执行update语句,此时

         更新数据库,更新成一级缓存中的数据,如果两个对象中属性一致,此时不执行update操作。

          (存入数据时,存入数据库的同时存入缓存区与快照区,更新时,只是更新缓存区,提交事务时,对比快照区与缓存区对象是否一样,不一样,说明已经进行了更新操作

           这时候才发送一条更新的sql给数据库,进行更新)

          目的:确保数据库中的数据一致。

五、事务管理

  1)事务:逻辑上的一组操作,要么都完成,要么都失败。

  2)事务特性:原子性,隔离性,一致性,持久性。

  3)事务的隔离级别

  4)在hibernate中设置事务的隔离级别:在核心配置文件中hibernate.cfg.xml中,设置

          <property name="hibernate.connection.isolation">4</property>

      通过数字设置隔离级别。

  5)事务的开启一般在service层开启。开启的过程需要保证与外部dao中用的时同一个连接对象(session),开发中,通常将session绑定到ThreadLocal中。

    事务业务层连接:

      1.为什么要在业务层使用事务:业务层可以调用多个dao层的操作

      2.在业务层使用事务时,必须保证获取事务的连接和dao层操作的连接是同一个,否则,就管理不了对应的操作。

      3.使用jdbc中事务业务层的处理方法:

          3.1 向下传递:开始在业务层先创建好一个连接,传给dao层,让dao层使用这个连接执行操作。

          3.2 使用ThreadLocal对象:在service方法当中把创建的连接绑定到对应的ThreadLocal当中,在dao方法中,通过当前线程获取连接对象。

      4.hibernate中的处理方法:

          4.1Hibernate框架内部已经绑定好了ThreadLocal,在SessionFactory中,提供了一个方法,getCurrentSession()方法,获取当前线程中的session。

            但是此方法默认不可使用。

          4.2需要在核心配置文件中配置

          <property name="current_session_context_class">thread</property>
          创建一个session绑定到当前线程。
           4.3通过它来操作时,不需要close,执行结束会自动close。
    在utils中:
    public static Session getCurrentSession(){
//从ThreadLocal中获取的session
Session session =sessionFactory.getCurrentSession();
return session;
}

    test中:

  @Test
public void test3(){
/*直接创建对象修改:如果没有指定其他字段,会把其他字段设为null*/
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
//更新操作
customer customer = new customer();//瞬时态
customer.setCust_id(3L);
customer.setCust_name("xxl");
session.update(customer);//持久态
//customer.setCust_name("123");//处于持久态的对象具有更新数据库的能力
transaction.commit();
//session.close();//游离态
//HibernateUtil.sessionFactory.close();
}
												

Hibernate持久化的更多相关文章

  1. 1.1Hibernate持久化类和Hibernate持久化对象状态

    一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...

  2. Hibernate持久化对象修改id重新保存的办法

    Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二 2017年11月10日 20:16:48 筱光 阅读数:1122   版权声明:本文为博主原创文章,未经博主允许不得 ...

  3. 2、Hibernate持久化编写

    一.对于hibernate中的PO编写规则: 1. 必须提供一个无参数的public构造方法   2. 所有属性要private ,对外提供public 的get/set方法   3. 在PO类必须提 ...

  4. (转) Hibernate持久化类与主键生成策略

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

  5. hibernate 持久化对象 save

    hibernate 持久化对象 save new出来的user对象是游离状态的对象,执行session.save()方法保存后,user对象就变为持久化了,持久化的对象跟数据库表双向绑定的意思, 对象 ...

  6. Hibernate持久化类属性映射

    Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hi ...

  7. 初学Hibernate持久化

    hibernate三种持久化对象状态:(持久化对象:Persistent Object=POJO + hbm映射) 1.瞬时状态(临时状态或自由态):PO对象刚创建(即new)开始进入瞬时状态,此时对 ...

  8. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  9. Hibernate持久化对象状态

    在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...

  10. hibernate持久化框架

    Hibernate是一个优秀的持久化框架 瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态 持久状态:保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态 持久化: ...

随机推荐

  1. ElasticSearch6.5.0 【字段类型】

    字符串类型 text 适合全文索引,有分析的过程 keyword 适合结构化的数据,比如地址.电话号码... 数字 long [带符号64位整数]范围:-263 ~ 263-1 integer     ...

  2. python自动化开发-[第二十四天]-高性能相关与初识scrapy

    今日内容概要 1.高性能相关 2.scrapy初识 上节回顾: 1. Http协议 Http协议:GET / http1.1/r/n...../r/r/r/na=1 TCP协议:sendall(&qu ...

  3. HDU4560 二分最大流

    http://acm.hdu.edu.cn/showproblem.php?pid=4560 网络流好像经常搭配上二分和拆点. n个歌手,m种歌曲流派(n<=m<=75) 我们想要安排尽可 ...

  4. Spring Boot学习记录02_构建SpringBoot工程_通过idea构建

    1.通过idea新建工程 2.Initial Service Url指向的地址就是Spring官方提供的Spring Initializr工具地址 3.结合情况进行设置 4.这里我选择的版本是1.5. ...

  5. Burrow 服务的安装部署

    Burrow 服务的安装部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近协助开发的同时帮忙把10个topic的数据使用5个topic的来工作.结果发现数据flume在手机数 ...

  6. PHP 连接 Memcached 服务

    1.需要安装php的Memcached扩展,具体安装步骤不做介绍了. 2.php连接memcached的mem.php 文件 <?php $memcache = new Memcached; $ ...

  7. MyBatis-SqlSessionFactory的创建

    Main 方法,mybatis 版本为 3.5.0 解析配置文件的所有信息,保存在 Configuration 中,返回包含 Configuration 的 DefaultSqlSession Map ...

  8. Kafka技术内幕 读书笔记之(三) 消费者:高级API和低级API——消费者消费消息和提交分区偏移量

    消费者拉取钱程拉取每个分区的数据,会将分区的消息集包装成一个数据块( FetchedDataChunk )放入分区信息的队列中 . 而每个队列都对应一个消息流( KafkaStream ),消费者客户 ...

  9. 163邮箱SMTP设置

    如题要设置系统邮件自动发送 首先注册的网易邮箱要去开通SMTP服务,然后就是端口的设置 授权码 端口

  10. NodeJs 学习笔记(一)Wedding 项目搭建

    说明:Ubuntu16.04 自带的NodeJs版本太低,安装包更新不了,只能编译安装了 一.NodeJs编译安装 下载:https://nodejs.org/en/download/ 修改目录权限: ...