Hibernate学习笔记-CRUD操作、一级缓存、主键生成器、错误分析

 

基本部分

ormapping的概念

    o:object

    r:ralationship

    mapping:映射

   把一个关系型的数据库描述成一个对象,通过映射的方式

jdbc的缺点

        1、代码比较繁琐

    2、sql语句平台的移植性不是很强

    3、没有data pool(数据缓存)

    4、当jdbc调用mysql的存储过程的时候,存储过程本身移植性比较差

    5、没有做到面向对象开发

hibernate优点

        1、面向对象的编程

        2、缓存    

                重点

                一级缓存    二级缓存     查询缓存

        如果数据量不是特别大

            hibernate缓存

            oscache   不支持分布式缓存

            ehcache   不支持分布式缓存

            redis      分布式缓存

            memorycache  分布式缓存

        3、代码操作比较简单

    4、平台的移植性比较强

hibernate的缺点

           如果该项目对sql的优化要求特别高,不适合用hibernate

           如果数据库的数据量特别大,也不适合用hibernate

           如果表与表之间的关系比较复杂,也不能用hibernate来做

hibenate使用的场合

        中小型企业:

           表的关系不是很复杂

           数据量不是很大

完成crud的操作

导入jar包

       

hibernate.cfg.xml

持久化类和映射文件

 

 

 

客户端

        1、产生表

       

  2、save操作

       

 3、查询操作

·

4、查询其中的一条数据

5、修改

6、删除

说明

     源代码的路径

        hibernate-distribution-3.5.6-Final-dist/hibernate-distribution-3.5.6-Final/project/core

  加载配置文件的方式

        1、

       

        2、

       

配置文件与映射文件的关系

hbm2ddl.auto

sessionFactory

session

        1、crud操作都是由session来完成的

    2、Session是一个接口,实现类是SessionImpl

    3、在创建sessionImpl的时候,传递一个参数为Connection,所以在hibernate编程

       的时候,创建session相当于打开了一个连接

    4、当关闭session的时候,相当于关闭了一个连接

transaction

        1、事务是由session来产生的

    2、事务默认是关闭的,必须手动开启

    3、session.beginTransaction是对Connection.setAutoCommit(false)进行了封装

   4、transaction.commit()的内部执行了connection.commit()代码

hibernate的反向工程

   由表生成持久化类和映射文件

   图1

               

图2

图3

 

图4

图5

  

图6

       

图7

       

主键产生器

increment

  即便在程序中设置了主键的值,也不起作用

assigned

identity

uuid

      uuid是由hibernate内部生成的

sequences

       

类型

hibernate类型

java类型

        java中的类型  这种类型效果高

hibernate的加载流程

hibernate的内部执行流程

 

对象的状态

   临时状态和脱管状态:

      临时状态的对象肯定是从new创建来的

      脱管状态的对象肯定是从持久化状态转化过来的

状态转换图

 

  对session.update方法的一个分析

持久化状态的对象

        可以通过session.save/update/get方法把一个对象变成持久化对象

        变成持久化状态的对象只说明该对象进入了hibernate的区域

       和数据库没有关系,和数据库有关系的只有事务

脱管状态的对象

    可以通过session.close/evic/clear方法

副本

 

flush方法

    说明:

        当执行session.flush方法的时候,hibernate内部会检查所有的持久化对象

        会判断该对象和数据库有没有对应的数据(根据标示符id),如果没有

        则发出insert语句,如果有,则再让该对象和副本进行对比,如果和副本一样,则

        什么都不做,如果不一样,则发出update语句

        session.flush的时候,只不过是向数据库发送了sql语句,但是值在数据库中并不

        存在。

 

 

一级缓存

    概念:私有缓存

          事务级别的缓存

          线程级别的缓存

缓存

缓存的类型

对象缓存

     把对象的标示符作为key值,把对象本身作为value值

数据缓存

    可以把sql语句作为key值,把结果作为value 值

操作

get

save

update

evict

clear

close

说明:

     1、一级缓存的生命周期和session的生命周期是一致的

     2、当执行session.close的时候,一级缓存就消失了

对象的状态和缓存的关系

    如果一个对象是持久化状态,说明该对象在一级缓存中

    如果一个对象是脱管状态的对象,说明该对象已经从一级缓存中清除了

session

   1、crud操作是由session完成的

   2、与数据库的连接是由session打开的

   3、对象的状态和一级缓存与session紧密相关

   4、数据安全性的问题

   打开session的方式

openSession

        1、只要调用一次openSession方法都会打开一个新的连接

        2、这种方式效率不是很高

        3、利用这种方式很容器的就可以操作session的缓存

getCurrentSession

     1、把session放入到threadlocal中,确保线程安全

     2、在整个线程中可以共享session,并且该session只有一个

     3、在threadlocal中存放Map<SessionFactory,Session>,因为整个hibernate应用

         sessionFactory只有一个,所以session肯定只有一个

使用

  步骤1

        在hibernate.cfg.xml文件中

       

  步骤2

    说明:

          1、crud操作都必须在事务的条件下进行

          2、当事务提交,session自动关闭

关系部分

一对多的单项

       

               

       

               

     从Classes端能联系到Student,但是从Student端联系不到Classes,这种情况称为

     一对多的单项

保存班级

保存学生

保存班级同时保存学生

在保存班级的时候级联保存学生

第一步

       

第二步

 

   

   上述两步OK,在执行session.save方法的时候,就可以在保存班级的时候级联保存

    学生

显示操作

        在代码中调用session.save/update方法进行操作的时候,这种情况为显示操作。

隐式操作

    在代码中并没有session.save(student)这样的代码,但是最后却形成了保存student

   的sql语句,所以这个操作是在hibernate内部执行的,并不是由程序来执行的。

在保存班级的时候级联更新学生

说明:

     当事务提交的时候,执行了session.flush:

         1、检查session一级缓存中所有的持久化对象

              如果该对象在数据库中没有相应的记录,则发出insert语句

              如果该对象在数据库有相应的记录(有id值),则和副本进行对比

               如果一样,则什么都不做,如果不一样,则发出update语句

         2、如果在Classes.hbm.xml文件中的set元素中有cascade选项,并且值为

              "save-update",这个时候,hibernate内部再次会去检查classes的关联对象

              Set<Student>:students,在set集合中一个一个查找,如果该对象是临时状态

              的对象,则发出insert语句,如果是持久化状态的对象,则会对照副本

               来判断是否发出update语句

在更新班级的时候级联更新学生

级联说明

    对象与对象之间的操作,在保存班级的同时保存学生,指的是保存的一般属性和

     学生的一般属性,和外键没有关系。

错误分析

错误1

  

错误2

 

所以在一个持久化类中必须有一个默认的构造函数

 

错误3

       在映射文件中,主键的生成机制用的是

           

        但是表却不支持,所以会报这样的错误

错误4

   该类不是一个持久化类,在映射文件中找不到

错误5

  在映射文件中,找不到相应的属性,写错了

错误6

   第一种情况:

        在映射文件中找不到上面指定的Person

   第二种情况:

        该映射文件根本没有在配置文件中进行配置

错误7

 

 

    

 

 在映射文件中

               

   把该集合中的级联去掉了

 所以hibernate在保存classes的时候,不能保存student了。所以student是一个临时状态的

对象

错误8

   错误的意思:要删除的对象是从一个对象中关联提取出来的

  通过映射文件可以看出:

      通过classes在hibernate内部建立了classes与student之间的关系。

  要通过classes把student删除掉,就会报上面的错误

解决方案:在students集合提取出来以后,解除关系

 

 

猜你喜欢

转载自blog.csdn.net/a5421901/article/details/88363762