Hibernate持久化类详解

版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/84260707

2 Hibernate持久化类详解


上接Hibernate入门学习:https://blog.csdn.net/biggerchong/article/details/84229658 

目录

2 Hibernate持久化类详解

2.1持久化类的编写规则

2.2主键生成策略

2.2.1主键的分类

2.2.2 hibernate中主键生成策略

2.2.3 持久类对象3种状态

2.2.4 Hibernate一级缓存

2.2.5 Hibernate事务管理

2.3Hibernate的其他API

2.3.1 Query

2.3.2 Criteria

2.3.3 SQLQuery


2.1持久化类的编写规则

  1. 对持久化类提供一个无参数的构造方法:

                     Hibernate底层需要使用反射生成实例

  1. 属性需要私有,对私有属性提供public的get/set方法:

                     Hibernate中获取设置对象的值

  1. 对持久化类提供一个唯一标识OID(Object Identifier,对象标识符又称为物联网域名)与数据库主键对应:

                   Java中通过对象的地址区分是否是同一个对象,数据库中通过主键确定是否是同一个记录,在Hibernate中通过持久化类的OID的属性区分是否是同一个对象。

  1. 持久化类中的属性尽量使用包装类类型:

                   对应数据库中的NULL

  1. 持久化类不要使用final进行修饰:

                   Hibernate中的延迟加载是其优化手段,返回的是一个代理对象,如果不能被继承将变的毫无意义。


2.2主键生成策略

2.2.1主键的分类

         自然主键:主键的本身是表中必须的一个字段(实体中的一个具体的属性)

         代理主键:主键的本身不是表中必须的字段(不是实体中某个具体的属性)

在实际开发中尽量使用代理主键:

  1. 一旦有自然主键参与到业务逻辑中,后期修改维护难度大大提升
  2. 好的程序设计满足OCP原则:对程序的扩展是open的,对程序的修改是close

 

2.2.2 hibernate中主键生成策略

在实际开发中一般不允许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置。在Hibernate中微量减少程序编写提供了很多种的主键成成策略。

  1. incrementHibernate中提供的自动增长机制,适用short、int、long类型的主键,单线程中使用
  2. identity适用以上三种类型的主键,使用数据库底层自动增强机制。适用于有自动增强机制数据库(MYSQL、                                   MSSQL),Oralce不适用
  3. sequence适用以上三种类型主键,采用序列的方式,支持Oracle。(MYSQL、MSSQL不支持)
  4. uuid适用于字符串类型的主键,使用hibernate中的随机方式生成字符串主键
  5. native本地策略,可以根据数据库自动在identity、sequence间切换
  6. assignedHibernate放弃主键的管理,需要手动表写程序或者用户自己设置
  7. foreign外部的一对一的一种关联映射情况下使用。(了解)

 

2.2.3 持久类对象3种状态

瞬时态对象:没有OID标识,不被session管理

    获得:

     Customer customer = new Customer( );

    状态转换:

             瞬时—>持久

             save(Object o)saveOrUpdate(Object o)

              瞬时—>脱管

             customer.setCstr_id(Long long);

 

持久态对象:有OID标识,被session管理; 持久态对象具有自动更新数据库的功能,不用额外session.update( );这是因为Hibernate一级缓存机制的存在。

   获得:

  1. session.get(Customer.class,id);
  2. session.load(Customer.class,id);
  3. session.find(..);
  4. session.Iterate(..);

   状态转换:

         持久—>瞬时

         session.delete(..)

         持久—>脱管

         session.close();  clear();  evict(Object o);

 

脱管态对象:有OID标识,不被session管理

    获得:

          Customer customer = new Customer( );

          Customer.setCstr_id(Long long);

   状态转换:

           脱管—>持久

            update(Object o)saveOrUpdate(Object o)

           脱管—> 瞬时

             customer.setCstr_id(null);

 

2.2.4 Hibernate一级缓存

 

2.2.5 Hibernate事务管理

事务:事务指的是逻辑上的一组操作,做成这组操作的各个逻辑单元要么全都成功,要么     全都失败。

 

事务特性:

  1. 原子性:代表事务不可分割
  2. 一致性:代表事务执行前后,数据的完整性保持一致
  3. 隔离性:代表一个事务执行的过程中,不会受到其他事务的干扰
  4. 持久性:代表事务执行完毕后,数据就会持久到数据库中

    如果不考虑隔离性将会产生的安全性问题?

             读问题:

                 脏读:一个事务读到另一个为提交的数据。

                 不可重复读: 个事务读到领一个事务已经提交的update数据,导致前一个事务多次查询结果不一致。

                 虚读: 一个事务读到另一个事务已经提交的insert数据,导致前一个事务多次查新结果不一致。

            写问题(了解):  引发两类丢失更新

 

读问题的解决:

      设置事务的隔离级别(红色为重点):

              Read uncommitted: 以上读问题都会发生

                  Read committed: 解决脏读,但是不可重复读和虚读有可能发生

                  Repeatable read:  解决脏读和不可重复读,但是虚读有可能发生

                         Serializable解决所有读问题,但是耗资源耗时(不推荐)

 

Hibernate中设置事务隔离级别:

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


2.3Hibernate的其他API

自定义封装的Session工具类

2.3.1 Query

Query接口用于接收HQL(Hibernate Query language),HQL是Hibernate查询语言,与SQL语言类似,是一种面向对象的查询语言。

2.3.2 Criteria

CriteriaQBC( Query By Criteria ),更加面向对象的一种查询方式。

2.3.3 SQLQuery

SQLQuery用于接收SQL语句,是在SQL查询特别复杂的情况下使用SQL。


下接Hibernate关联映射(一对多/多对多):https://blog.csdn.net/biggerchong/article/details/84340105

                                                                                  -----谢谢阅读!                             ---------知飞翀

猜你喜欢

转载自blog.csdn.net/biggerchong/article/details/84260707