Hibernate架构
下图提供了hibernate体系的高层视图:

Hibernate全面解决方案:

Hibernate核心API
Configuration
负责管理数据库的配置信息。数据库的配置信息包含了Hibernate连接数据库的一些基本信息(hibernate.cfg.xml),Configuration对象可以通过加载配置文件获取并管理这些信息.
Configuration config = new Configuration().configure();
或者:
File file = new File(“C:\\myhibernate.xml”);
Configuration config = new Configuration().configure(file);

SessionFactory (org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。  作为  Session
的工厂和 ConnectionProvider 的客户。SessionFactory 可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。

SessionFactory使用要点如下:
1.    负责创建Session对象,可以通过Configuration对象创建SessionFactory对象
2.    SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。
3.    SessionFactory还负责维护Hibernate的二级缓存。
4.    SessionFactory对象的创建会有较大的开销,而且SessionFactory对象采取了线程安全的设计方式,因此在实际中SessionFactory对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个SessionFactory实例

SessionFactory创建代码如下:
Configuration config =     new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();

Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。其隐藏了
JDBC  连接,也是  Transaction  的工厂。它会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。

Session定义了添加、更新、删除和查询等操作,是持久化操作的基础。Session的设计是非线程安全的,因此,一个Session对象只可以由一个线程使用。

Session对象可以由SessionFactory对象创建。

Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
    Session session = factory.openSession();

Transaction
将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。
使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)
    Transaction tx = session.beginTransaction();

Hibernate对象的状态和生命周期

◦    注意:  
◦    使用debug详细观察程序运行,加深理解。

Transient 瞬时/临时态
}    使用new 操作符初始化的对象不是立刻就持久的。
}    跟session没有任何关系
}    跟数据库没有任何关系,数据库中没有对应记录存在
Persist 持久态
}    和session对象相关。以map形式存入到session中
}    在数据库中有对应的记录
Detached托管/游离态
}    和session对象无关
}    在数据库中有对应的记录

游离态,托管态的经典案例
学生对班级的模型,多对一模型。班级端放弃关系的维护权,学生端维护
案例:修改学生信息的时候,如何维护与班级的关系

新传入的student对象中的班级引用为空,如果直接update保存关系丢失。
    需要进行关系维护。
    先从数据库中查出原先该id对应的学生对象。将班级取出,与新的student建立关系。
    由于原先的和新修改的id相同,hibernate会报异常。则必须将原先的从持久态变成游离态。再保存新的student对象

 @Resource
private HibernateTemplate hibernateTemplate;
public void update(Student student) {
Student temp=(Student) hibernateTemplate.get(Student.class, student.getId());
//获取真正的session对象
SessionFactory sessionFactory=hibernateTemplate.getSessionFactory();
//把查询出来的对象从session中的持久态变成游离态
//true有session返回当前线程session 无session新建session。 false 必须 返回当前线程的session
Session session=(Session) SessionFactoryUtils.getSession(sessionFactory, true);
//将temp对象从持久态变成游离态
session.evict(temp);
//session.clear();
//建立新修改的student对象和session建立关系,变成持久态,comit提交保存
student.setMyClass(temp.getMyClass());
hibernateTemplate.update(student); }

hibernate框架的核心对象和相关知识点的更多相关文章

  1. 【Hibernate步步为营】--核心对象+持久对象全析(一)

    引言         上篇博客对Hibernate进行了基本的解析.并分析了它的一些特性. Hibernate可以如此的流行也是由于它有诸多长处,不论什么事物都有两面性.Hibernate尽管流行.可 ...

  2. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  3. 【Hibernate步步为营】--核心对象+持久对象全析(二)

    上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA.SessionFactory.Session.JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以 ...

  4. 【Hibernate步步为营】--核心对象+持久对象全析(三)

    上篇文章讨论了Hibernate持久对象的生命周期,在整个生命周期中一个对象会经历三个状态,三种状态的转换过程在开发过程中是可控的.并且是通过用法来控制它们的转化过程.详细的转化过程今天就来着重讨论下 ...

  5. hibernate框架学习之对象状态

    lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...

  6. hibernate框架(3)---持久化对象

    持久化对象 再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别: 简单总结: (1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库 ...

  7. 使用Hibernate框架来更新对象的注意事项

    Hibernate在更新对象的时候,如果对象的有些属性没有设置,那么在更新的时候,会被默认为空. 特别在更新表单对象的时候. 例子: 如: Department部门类 该部门类有以下属性:  id : ...

  8. Hibernate框架用法

    一,Hibernate框架介绍 没有Hibernate之前,使用jdbc来连接数据库时,需要反射加载驱动,再获取连接 在连接上获取sql承载块,传入sql语句执行,获取结果集,解析结果 Hiberna ...

  9. springmvc框架中的核心对象DispatcherServlet

    SpringMVC是Spring中的模块,它实现了mvc设计模式,首先用户发起请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映 ...

随机推荐

  1. VS2010/MFC编程入门之七(对话框:为对话框添加控件)

    创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中鸡啄米已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件. 上一讲中鸡啄米创建了一个名为“A ...

  2. jquery 添加列

    {field:'action',title:'操作',width:70,align:'center',  formatter:function(value,row,index){  if (row.e ...

  3. 【转载】IEEE754 学习总结

    以下是参考<IEEE754 学习总结>并结合自己学习总结 一:前言二:预备知识 三:浮点数的表示范围四:将浮点格式转换成十进制数 一:前言 前不久在分析一个程序的过程中遇到了浮点运算,也就 ...

  4. laravel 项目部署注意事项

    1.'Failed to open stream: Permission denied' error - Laravel Laravel >= 5.4 php artisan cache:cle ...

  5. struts2.1.8 spring2.5.6 hibernate3.3G 依赖jar包

    ----struts2.1.8---- struts2-core-2.1.8.1.jar struts2核心包 struts2-json-plugin-"} struts2-spring-p ...

  6. jquery.validation.js 使用

    引用文件: "~/assets/global/plugins/jquery-validation/js/jquery.validate.min.js", "~/asset ...

  7. POJ 1159 Palindrome(最长公共子序列)

    http://poj.org/problem?id=1159 题意: 给出一个字符串,计算最少要插入多少个字符可以使得该串变为回文串. 思路: 计算出最长公共子序列,再用原长-LCS=所要添加的字符数 ...

  8. 七步精通Python机器学习--转载

    作者简介: Matthew Mayo    翻译:王鹏宇 开始.这是最容易令人丧失斗志的两个字.迈出第一步通常最艰难.当可以选择的方向太多时,就更让人两腿发软了. 从哪里开始? 本文旨在通过七个步骤, ...

  9. node 常用指令 node 扩展链接

    node -v       node 版本 npm -v     npm版本号,npm是在安装nodejs时一同安装的nodejs包管理器  (注册.安装模块,和小乌龟有点像) npm list  当 ...

  10. 前端引用公共html模块方案

    最近临时一个负责公司官网的妹纸请假,于是临时接手了下官网的项目,官网都是静态页面,算是很简单的,但发现页面挺多,而每个页面总有部分是和其他页面一模一样的,比如页头.页尾等,这样就导致一个地方的修改要在 ...