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

  • 相关阅读:
    jQuery EasyUI API 中文文档 数字框(NumberBox)
    jQuery EasyUI API 中文文档 数值微调器(NumberSpinner)
    jQuery EasyUI API 中文文档 日期时间框(DateTimeBox)
    jQuery EasyUI API 中文文档 微调器(Spinner)
    jQuery EasyUI API 中文文档 树表格(TreeGrid)
    jQuery EasyUI API 中文文档 树(Tree)
    jQuery EasyUI API 中文文档 属性表格(PropertyGrid)
    EntityFramework 数据操作
    jQuery EasyUI API 中文文档 对话框(Dialog)
    jQuery EasyUI API 中文文档 组合表格(ComboGrid)
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7388318.html
Copyright © 2011-2022 走看看