持久化对象的唯一标识OID

1:我们都知道,在java中按照内存地址来区分同一个类的不同对象

       而关系数据库按照主键来区分一条记录

在Hibernate中使用OID来建立内存中的对象和数据库中记录对应的关系

????什么是OID

答:OID就是持久化类(Student)与数据库主键表对应属性,用唯一来区分持久化对象

2:为何要使用包装类呢(如Integer)?

因为包装类Integer可以存储null值

我们来模仿这样的一个场景:“一个学生成绩为0,无法区分是参加了考试考取了0分,还是没有成绩。如果使用包装类,数据库就会存入null,证明该学生没有参加考试"

二:主键生成策略

increment

identity

sequence:在DB端生成序列

native:在DB端生成序列

uuid:在应用程序端生成

assigned:在应用程序端生成

在小配置文件hbm.xml中进行如下配置

当我们使用sequence的时候,仅仅只有oracle支持,当我们使用active的时候,无论是mysql还是oracle,都可以生成序列。

native)

采用数据库支持自增策略, mysql就用identity 、oracle就用sequence

策略1) ---> 策略4) 要求数据库主键必须为数字 ,因为只有数字才能自增

uuid)生成一个32位的16进制数,在java应用端产生,同样不需要程序员手动添加

复合主键,是一种特殊 assigned类型 自然主键 (通常需要手动指定),PO类必须实现Serializable接口

三:hibernate中java对象的三种状态

1:瞬时状态

2:持久状态

3:游离状态

详见下图:

赠图一张!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

四:关于load()方法和get()方法的区别

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。

其区别在于:

如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。

Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。

举个例子,代码如下:

    public static void getTest()
{
Student stu=(Student)Hibernate_until.getSession().get(Student.class, 2);
}
public static void getload()
{
Student stu=(Student)Hibernate_until.getSession().load(Student.class, 2);
System.out.println(stu.getClass());
System.out.println(stu);
}

当执行getload()时进入断点调试,当没有启用stu对象的时候,默认geload()方法的initialized属性是false;target默认是null值。

当点击stu对象时,这两种属性激活,initialized属性变为true,target则为代理对象存入相应的数据。

与get()的区别:
   1:在立即加载对象(当hibernate在从数据库中取得数据组装好一个对象后
   会立即再从数据库取得数据此对象所关联的对象)时,如果对象存在,
   load()和get()方法没有区别,都可以取得已初始化的对象;但如果当对
   象不存在且是立即加载时,使用get()方法则返回null,而使用load()则
   抛出一个异常。因此使用load()方法时,要确认查询的主键ID一定是存在
   的,从这一点讲它没有get方便!

2:在延迟加载对象(Hibernate从数据库中取得数据组装好一个对象后,
  不会立即再从数据库取得数据组装此对象所关联的对象,而是等到需要时,
  都会从数据库取得数据组装此对象关联的对象)时,get()方法仍然使用
  立即加载的方式发送SQL语句,并得到已初始化的对象,而load()方法则
  根本不发送SQL语句,它返回一个代理对象,直到这个对象被访问时才被
  初始化。

五:脏检查和刷新缓存机制

赠图一张:

解析:当事务提交时,hibernate会对session中的持久状态的对象进行检测,判断对象中的数据是否发生了改变。

当内存中的数据发生改变时,就要将数据更新到db端

如何脏检查:

当一个实体类对象存入到session中时,session会为该对象的值类型生成一份快照,当session刷新缓存的时候首先进行脏检查,即比较对象中的数据和快照,来判断对象中的数据是否发生了改变,如果发生了变化,session会根据脏对象的最新数据来更新db端的数据

那么,session会在什么时间点来刷新缓存呢

1)事务的commit

2)session.flush()方法

Hibernate框架后续的更多相关文章

  1. 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建

    1. 前言 基于Maven的开发方式开发项目已经成为主流.Maven能很好的对项目的层次及依赖关系进行管理.方便的解决大型项目中复杂的依赖关系.S2SH(Struts2+Spring+Hibernat ...

  2. Hibernate框架 初识 ORM概念

    Hibernate概述 Hibernate是一个ORM(对象关系映射)映射框架,它的核心思想就是在底层对JDBC进行了一次封装. 什么是框架 IT语境中的框架,特指为解决一个开放性问题而设计的具有一定 ...

  3. Hibernate框架(四)缓存策略+lazy

    Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两 ...

  4. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...

  5. Hibernate 系列 01 - 框架技术 (介绍Hibernate框架的发展由来)

    引导目录: Hibernate 系列教程 目录 本篇导航: 为什么学习框架技术 框架的概念 主流框架的介绍 1.为什么学习框架技术 如何制作一份看上去具有专业水准的PPT文档呢?一个简单的方法就是使用 ...

  6. 2.0、Hibernate框架的简单搭建

    一.Hibernate:是一个开放源代码的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句 ...

  7. 【Hibernate框架】对象的三种持久化状态

    一.综述 hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象).PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线 ...

  8. hibernate框架int和Integer类型区别

    hibernate 框架在定义实体时,int类型最好定义为Inttger类型,因为在注入时int是值类型不允许为空.

  9. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

随机推荐

  1. UIActivityIndicatorView-初识IOS

    UIActivityIndicatorView是一个加载动画的视图,一般加载一个网页页面之前会经常用到. 上一个随笔,我讲到了页面加载的页面的那些代理方法 - (void) viewWillAppea ...

  2. linux加入windows域之完美方案(转载)

    概念理解:1.kdc:可信任的密钥分发中心(KDC, Key Distribution Center).2.Winbind是Samba套件的功能之一.它允许Unix系统利用Windows NT的用户帐 ...

  3. [CSAPP笔记][第六章存储器层次结构]

    第六章 存储器层次结构 在简单模型中,存储器系统是一个线性的字节数组,CPU能够在一个常数访问每个存储器位置. 虽然是一个行之有效的模型,但没有反应现代系统实际工作方式. 实际上,存储器系统(memo ...

  4. php不会的点

    1.DIRECTORY_SEPARATOR:DIRECTORY_SEPARATOR是一个显示系统分隔符的命令,DIRECTORY_SEPARATOR是PHP的内部常量,不需要任何定义与包含即可直接使用 ...

  5. Visual Studio/vs2013 正忙

    打开VS解决方案时一直显示Visual Studio正忙,项目卡在初始化,此后试了很多方法,将项目拷贝到领一个磁盘当中再打开就可以直接打开了

  6. mysql查询分组归类函数-group_concat,通常与group_by一起使用

    select a.`name`,group_concat(b.name SEPARATOR'.') as persons from `group` as a,`person` as b,`person ...

  7. java必备基础知识(一)

    学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...

  8. (转) Resource file and Source file

    基本上是这样的,Sourcefile文件夹里面放的是CPP文件这些,Resourcefile文件夹是资源文件夹,里面可以放你程序里需要的资源,包括图标,对话框,图片等等:对应的文件如下: Source ...

  9. Mysql学习(慕课学习笔记1)启动、登录及常用命令

    Mysql学习 启动数据库服务 net start mysql    (不能加分号!!!!) 关闭数据库服务 net stop mysql 登录数据库 mysql -uroot -p -P3306 - ...

  10. 慕课linux学习笔记(七)常用命令(4)

    帮助命令 Man命令 Man的级别 命令帮助 可被内核调用的函数帮助 函数和函数库帮助 特殊文件帮助 /dev 配置文件帮助 游戏的帮助 其他杂项的帮助 管理员可用命令帮助 内核相关文件的帮助 -f ...