zoukankan      html  css  js  c++  java
  • 5.Hibernate 核心开发接口

    一、Configuration(AnnotationConfiguration)

    作用:进行配置信息的管理

    目标:用来产生SessionFactory

      可以在configure 方法中指定hibernate配置文件,默认(不指定)时在classpath(bin目录下)下加载hibernate.cfg.xml 文件

    二、SessionFactory

    作用:用于产生Session的工厂 (数据库连接池)

      当它产生一个Sesion时,会从数据库连接池取出一个连接,交给这个Session,

      可以通过这个Session取出这个连接(浅显的理解为:Session里面封装了Connection)

    关注两个方法:

      getCurrentSession():表示当前环境没有Session时,则创建一个,否则不用创建

      openSession(): 表示创建一个Session(3.0以后不常用),使用后需要关闭这个Session

      两方法的区别:

      1.openSession永远是每次都打开一个新的Session,而getCurrentSession不是,

      是从 '上下文'找、只有当前没有Session时,才创建一个新的Session

      2.OpenSession需要手动close,getCurrentSession不需要手动close,事务提交自动close

      3.getCurrentSession界定事务边界

      上下文:所指的上下文是指hibernate配置文件(hibernate.cfg.xml)中的“current_session_context_class”所指的值:

      (可取值:jta|thread|managed|custom.Class)

      常用;①thread:是从当前线程找、只有当前线程没有Session时,才创建一个新的Session,主要从数据界定事务

            ②jta:主要从分布式界定事务,运行时需要Application Server来支持(Tomcat不支持)

    三、Session

      1、管理一个数据库的任务单元

      2、save() Transient状态 经过save方法 变成  Persistent 状态

      3、delete() 被delete对象需要有Id  因为是通过Id去删除的  

      4、load()

      5、Get()

        load方法和get方法的区别:

          a)load 返回的是代理对象,延迟加载,等到真正使用对象的内容才发出sql语句,

          b)get 不会延迟加载,调用get方法,会直接发出sql语句

        另外:get() 和 load() 只根据主键查询,不能根据其他字段查询

      6、update()

        1.本意用来更新detached对象,更新完成后转为为persistent状态(默认更新全部字段)

        2.更新transient对象会报错(没有ID)

        3.更新自己设定ID的transient对象可以(默认更新全部字段)

        4.persistent状态的对象,只要设定字段不同的值,在session提交时,会自动更新(默认更新全部字段)

         5.更新部分更新的字段(更改了哪个字段就更新哪个字段的内容)(三种方法)

          a)update/updatable 属性

          b)dynamic-update属性

          c)使用HQL(EJBQL)面向对象的查询语言(建议)

          Query q = session.createQuery("update Student s set s.name='z5' where s.id = 1");

          q.executeUpdate();

      7、saveOrUpdate()

        在执行的时候hibernate会检查,如果对象在数据库中已经有对应的记录(是指主键),则会更新update,否则会添加数据save

      8、clear()

        清除session缓存

        无论是load还是get,都会首先查找缓存(一级缓存,也叫session级缓存),如果没有,才会去数据库查找

      9、flush()

        同步缓存和数据库中的数据,如果缓存中的数据和数据库中的不一致,则更新数据库中的数据

        在hibernate中也存在flush这个功能,在默认的情况下session.commit()之前时,其实执行了一个flush命令

      10、SchemaExport 设置是否打印,是否交由数据库执行

    注:持久化对象的三种状态

    一、瞬时对象(Transient Object)

      如:Teacher t = new Teacher();  t.setName("xzk1");

      只是在内存中有t对象,缓存中没有,而且这个t对象是没有ID值的(数据库中)

    二、持久化对象(Persistent Object)

      如:Teacher t = new Teacher();  t.setName("xzk1");

        t.save()

      在内存中有t对象,并且经过save() 后,缓存中也有,ID经过注解添加后也有(数据库中)

    三、离线对象(Detached Object)

      如:Teacher t = new Teacher();  t.setName("xzk1");

        t.save()

        session.getT****.commit();

      在持久化的基础上,提交事务,此时session关闭,

      所以内存中还有,但是在session缓存中没有了,数据库中仍然还有这个ID

    注:缓存的概念:一个Transient对象在执行save方法时,session会在内存中开辟出一块缓存区,

      这块缓存区会存有一个Map集合,当save某个对象时,会把该对象的ID作为Key,该对象的引用作为value,

      当需要调用该对象时,会先从缓存中去查找,如果缓存中没有,再去问数据库要

      如:load 和 get 都会先问下缓存中有没有 对应的ID的 key

  • 相关阅读:
    Qt 错误汇集贴
    转:Qt编写串口通信程序全程图文讲解
    转:QT 的点点滴滴 错误总结
    转:Qt项目中遇到的一些小问题汇总
    转:AM335X 启动流程
    基于Xilinx Zynq的计算处理平台
    基于英伟达Jetson TX1的GPU处理平台
    基于6U VPX的 SRIO 接口, 和PCIe 接口的msata 固态存储卡
    国芯网 邀请国产芯片原厂入驻商城
    295-Xilinx Kintex-7 X7K325T的半高PCIe x4双路万兆光纤收发卡
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7388318.html
Copyright © 2011-2022 走看看