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. linux开启nscd服务缓存加速

    在我使用的阿里云主机上有观察到开启了一个服务nscd ,后来谷哥了下该服务的作用.了解到nscd会缓存三种服务passwd group hosts,所以它会记录三个库,分别对应源/etc/passwd ...

  2. try catch finally return

    public override bool Start(IServerConfig config) { bool flag = true; listenSocket = new Socket(Liste ...

  3. python应用-随机漫步

    对python应用的一个巩固,以及熟悉matplotlib的用法 效果如下: # -*- coding: utf-8 -*- """ Created on Fri Sep ...

  4. API设计原则(觉得太合适,转发做记录)

    API设计原则 对于云计算系统,系统API实际上处于系统设计的统领地位,正如本文前面所说,K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作,理解掌握 ...

  5. UVa 1210 连续素数之和

    https://vjudge.net/problem/UVA-1210 题意: 输入整数n,有多少种方案可以把n写成若干个连续素数之和? 思路: 先素数打表,然后求个前缀和. #include< ...

  6. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations 矩阵快速幂优化dp

    D. GukiZ and Binary Operations time limit per test 1 second memory limit per test 256 megabytes inpu ...

  7. .net core开发 (一)

    1..net core: 是微软开发的另外一个可以跨平台的.net 2..net framework,.net core, mono的关系三者都是.net在不同操作系统的实现 3. .net core ...

  8. thinkphp3.2笔记(5)创建项目 创建模型 实例化

    一 创建项目 1 拷贝框架 目录   public   thinkphp  .htaccess  index.php    [application不用拷贝,会自动生成] 2   public 下面创 ...

  9. 【转】IntelliJ IDEA的光芒会盖过Eclipse吗

    作为一个资深的Eclipse用户,我想对IntelliJ IDEA做一个更为严谨的审视.JetBrains的工作人员非常的友善,并为Podcastpedia.org和Codingpedia.org这两 ...

  10. 最全Python内置函数

    内置函数的基本使用 abs的使用: 取绝对值 absprint(abs(123))print(abs(-123)) result:123123 all的使用: 循环参数,如果每个元素都为真的情况下,那 ...