Hibernate常见概念以及关键技术
hibernate简介

one to one
<one-to-one name = “propertyName” class=“className” cascade=“all|none|save-update|delete” constrained=“true|false” outer-join=“true|false|auto” />
改
当前会话期
获取session
Student s = session.load(Student.class, new long(“123”)); s.setName(“yinhongbinTest”); s.flush();
关闭session
不同会话期
获取session Student s = session.load(Student.class,new Long(“123”)); 关闭session s.setName(“yinhongbinTest”); 获取session session.update(s); 关闭session
id
<id name = “propertyName” tyep=“typeName” column=“columnName” unSaved-value=“any|none|null|id_value”> <generator class =“generatorClass”> /id>
property
Hibernate技术

Hibernate 技术Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC 进行了非常轻量级的对象封装,把开发者从数据库编程中隔离开来,Java程序中所有进出数据库的操作都交给 Hibernate 来处理 ,它会为我们自动生成SQL 语句操作数据库 . 有了 Hibernate 后 ,程序员不再要写繁琐的SQL 语句 ,也不再要把实体对象一个个字段拆开又组装 .Hibernate 不仅负责从Java类到数据库表的映射(还包括从Java 数据类型到 SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理 SQL 和 JDBC 上的开发时间。
一、 Hibernate 架构的概要图Hibernate 的核心接口一共有 5 个,分别为 :Session、 SessionFactory、Transaction、Query 和 Configuration 。
这 5 个核心接口在任何开发中都会用到。
通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
下面对这五个核心接口分别加以介绍。
Session接口Session接口负责执行被持久化对象的CRUD 操作(CRUD 的任务是完成与数据库的交流,包含了很多常见的SQL 语句。
)。
但需要注意的是Session对象是非线程安全的。
同时,Hibernate 的session不同于JSP 应用中的HttpSession。
这里当使用session这个术语时,其实指的是 Hibernate 中的 session,而以后会将 HttpSesion 对象称为用户 session。
SessionFactory接口SessionFactory接口负责初始化Hibernate。
它充当数据存储源的代理,并负责创建Session对象。
这里用到了工厂模式。
需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个 SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个 SessionFactory。
Hibernate知识点

1 什么是HibernateHibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任2 Hibernate的核心类和接口:<1>Configuration负责管理Hibernate的配置信息,这些配置信息都是从配置文件hibernate.cfg.xml或者Hibernate.properties读取的,当然也可以自定义文件名称,只要在实例化Configuration的时候指定具体的路径就可以了<2>SessionFactoryConfiguration的实例会根据当前的配置信息,构造SessionFactory实例。
SessionFactory是线程安全的,一般情况下一个应用中一个数据库共享一个SessionFactory实例。
<3>Session一般的持久化方法(CRUD)都是通过Session来调用的,Session是非线程安全的<4>Transaction事务管理<5>Query查询的接口3 Hibernate的原理及步骤1. 读取并解析配置文件//采用默认的hibernate.cfg.xml来启动一个Configuration的实例例:Configuration configuration=new Configuration().configure();//如要修改默认配置文件名当然你可以选择不修改Configuration configuration=new Configuration().configure(new File("src/xxx.xml"));2. 读取并解析映射信息,创建SessionFactory例:SessionFactory sessionFactory =configuration.buildSessionFactory();3. 打开Session实例(它是线程不安全的,是共享同一个session,所以要ThreadLocal模式来控制)例:Session session = sessionFactory.openSession();4. 创建事务Transaction例:Transaction transaction = (Transaction)session.beginTransaction();5. CRUD操作(执行数据操作 CRUD 增删查改)例:增加session.save(pojo对象);增加或者修改session.saveOrOpdate(pojo对象)//当修改时候,id不存在将被抛出异常删除session.delete(pojo对象)//根据主键加载p1=(Person)session.load(pojo类.class, 主键值);6. 提交事务例:mit();7. 关闭Session实例及SessionFactory例: session.close();sessionFactory.close();4.Session的管理Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取,都与 Session息息相关,就如同在编写JDBC时需关心Connection的管理,以有效的方法创建、利用与回收Connection,以减少资源的消耗,增加系统执行效能一样,有效的Session管理,也是Hibernate应用时需关注的焦点。
hibernate框架的工作原理

hibernate框架的工作原理Hibernate框架的工作原理Hibernate是一个开源的ORM(Object-Relational Mapping)框架,它将Java对象映射到关系型数据库中。
它提供了一种简单的方式来处理数据持久化,同时也提供了一些高级特性来优化性能和可维护性。
1. Hibernate框架的基本概念在开始讲解Hibernate框架的工作原理之前,需要先了解一些基本概念:Session:Session是Hibernate与数据库交互的核心接口,它代表了一个会话,可以用来执行各种数据库操作。
SessionFactory:SessionFactory是一个线程安全的对象,它用于创建Session对象。
通常情况下,应用程序只需要创建一个SessionFactory对象。
Transaction:Transaction是对数据库操作进行事务管理的接口。
在Hibernate中,所有对数据库的操作都应该在事务中进行。
Mapping文件:Mapping文件用于描述Java类与数据库表之间的映射关系。
它定义了Java类属性与数据库表字段之间的对应关系。
2. Hibernate框架的工作流程Hibernate框架主要分为两个部分:持久化层和业务逻辑层。
其中,持久化层负责将Java对象映射到数据库中,并提供数据访问接口;业务逻辑层则负责处理业务逻辑,并调用持久化层进行数据访问。
Hibernate框架的工作流程如下:2.1 创建SessionFactory对象在应用程序启动时,需要创建一个SessionFactory对象。
SessionFactory是一个线程安全的对象,通常情况下只需要创建一个即可。
2.2 创建Session对象在业务逻辑层需要进行数据访问时,需要先创建一个Session对象。
Session是Hibernate与数据库交互的核心接口,它代表了一个会话,可以用来执行各种数据库操作。
2.3 执行数据库操作在获取了Session对象之后,就可以执行各种数据库操作了。
hibernate原理

hibernate原理Hibernate是目前为止最流行的ORM(Object-Relational Mapping,面向对象关系映射)框架之一。
它是一个基于Java的开源框架,可以自动映射Java对象和关系型数据库的表格。
下面将为大家介绍Hibernate原理。
1. Hibernate的架构Hibernate的架构包含三层,分别是持久层、业务逻辑层和展示层。
其中,持久层是Hibernate的重点,它用于处理数据存储和检索。
在Hibernate中,持久层将Java类和关系型数据库之间建立一对一或一对多的映射关系,实现了Java类与数据库表的交互。
2. Hibernate的持久化过程Hibernate的持久化过程主要包括对象创建、连接数据库、执行SQL语句、提交事务和回滚事务等五个步骤。
具体流程如下:(1)对象创建:首先,创建一个Hibernate的SessionFactory对象,该对象是Hibernate的核心对象,用于创建会话;接着,获取一个会话(Session)对象,会话对象负责将Java对象和数据库之间建立映射关系。
(2)连接数据库:创建数据库连接的过程,Hibernate使用hibernate.cfg.xml文件配置数据库连接信息,包括数据库URL、数据库名称、用户名、密码等。
(3)执行SQL语句:Hibernate框架可以自动生成SQL语句,执行完SQL语句后,将结果存储到Java对象的属性中。
(4)提交事务:一旦操作完成,Hibernate会将所有未提交的事务进行提交,向数据库中写入数据。
(5)回滚事务:如果操作失败,Hibernate会将未提交的事务进行回滚,保证数据的完整性。
3. Hibernate的核心概念Hibernate中的核心概念包括持久类、映射文件、关联关系、事务、缓存等。
(1)持久类:持久化类是Java类,表示与数据库表相对应的实体类。
Hibernate会自动将该实体类与数据库表相映射。
Hibernet上手指南

核心提示:Hibernate,很久以前我就听说过这个名词,但是似乎没什么动力让我去接近它,感觉它是一个很复杂的东西,一直没搞明白它到底是用来做什么的。
Hibernate上手Hibernate,很久以前我就听说过这个名词,但是似乎没什么动力让我去接近它,感觉它是一个很复杂的东西,一直没搞明白它到底是用来做什么的。
直到接手了一个项目在技术选型的时候我再一次的看到了Hibernate。
我尝试着去使用它,发现它并不是我想像中的那么深奥,它很易用。
你并不需要了解它的内部结构,它一样能为你工作的很好,如果你理解了它到底能为你做什么的话本文着重讲述了为什么要使用Hibernate,此外也简单的介绍了如何使用Hibernate,以及Hibernate中的一些基本概念。
我想借这篇文章来向还没有接触过Hibernate的开发者推荐款优秀的开源ORM产品,如果你已经实践过Hibernate,那么我想你没有必要再看下去。
一、Why Hibernate?现在流行“测试驱动开发”,相似的我觉得“目的驱动学习”是一种比较好的接受新技术,新知识的途径。
在学习一样新的技术之前,首先得明确到底有没有必要学习,已有的技术是否已经工作的很好,学习这个新的技术是为了解决什么问题。
如果你明确了以上问题,那么寻找并学习新的技术将会事半功倍,并且能快速应用到实际的开发当中来提高效益。
要说Hibernate,就得先介绍一下Object/Relation Mapper(ORM),中文翻译为对象关系映射。
之所以会产生这样的概念是源于目前软件开发中的一些不协调的思想。
目前流行的编程模型是OOP(Object Oriented Programming),面向对象的编程,而目前流行的数据库模型是Relational Database,这两者思考的方式不一样,这必然产生了开发过程中的不协调。
ORM 框架(也称为持久层框架,)的出现就是为了解决这样的问题,屏蔽底层数据库的操作,以面向对象的方式提供给开发者操作数据库中数据的接口。
Hibernate知识点总结

Hibernate是目前最流行的开源对象关系映射(ORM)框架。
Hibernate采用低侵入式的设计,也即完全采用普通的Java对象(POJO),而不必继承Hibernate的某个基类,或实现Hibernate的某个接口。
Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序开发者采用面向对象的方式来操作关系数据库。
因为我们知道hibernate它能支持透明持久化从这个角度来看它没有侵入性所谓侵入性它没有侵入hibernate任何的API所以它叫轻量级框架,轻量级框架的好处是没有侵入性另外的一个好处是为测试带来了好处,测试非常简单测试就行我们写普通的java应用程序一样不需要什么环境只需要几个jar包就可以了写个main函数一侧就可以了它没有侵入性和测试非常简单这是它流行的一个原因。
hibernate的优缺点优点:1、程序更加面向对象;2、提高了生产率;3、方便移植(修改配置文件);4、无侵入性。
缺点:1、效率比JDBC略差;2、不适合批量操作。
3、只能配置一种关联关系Hibernate有四种查询方案1、get,load方法,根据id查找对象2、HQL--hibernate query language(查询对象:Query)3、Criteria--标准查询语言(查询对象:Criteria,查询条件:Criterion)4、通过sql来查(查询对象:SQLQuery)具体Query/Criteria:1.Query接口封装了Hibernate强大的对象查询能力,同时也支持数据库的更新操作2.提供了动态查询的参数绑定功能3.提供list(),iterator(),scroll()等对象导航方法4.提供uiqueResult()方法获取单独的对象5.提供executeUpdate()方法来执行DML语句6.提供了可移植的分页查询方法Session:1、save,presist保存数据,persist在事务外不会产生insert语句。
有关hibernate相关知识点

关于Hibernate一、什么是Hibernate?Hibernate是一个轻量级的ORMapping框架ORMapping原理(Object Relational Mapping)ORMapping基本对应规则:1:类跟表相对应2:类的属性跟表的字段相对应3:类的实例与表中具体的一条记录相对应4:一个类可以对应多个表,一个表也可以对应对个类5:DB中的表可以没有主键,但是Object中必须设置主键字段6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样ORMapping的基本实现方式:使用JDBC,用SQL来操作数据库,只是看动态生成还是人工写代码来实现。
大家想想,我们实现过ORMapping吗?二、Hibernate能干什么:Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。
Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。
对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate 可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。
Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。
一个非常简要的Hibernate体系结构的高层概要图Hibernate运行时体系结构“最小”的体系结构方案,要求应用程序提供自己的JDBC 连接并管理自己的事务。
这种方案使用了Hibernate API 的最小子集.“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让Hibernate 来处理这些细节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件开发的分层思想:三层架构:数据表现层业务逻辑层数据持久层SUN的桌面应用Swing AWT 普通Java类JDBCSUN的WEB基本应用JSP 普通Servlet JDBCSUN的WEB高级应用JSF SessionBean PersistenceWEB国内流行开源Struts Spring Hibernate一、对象持久化的理论1.对象持久化:内存中的对象转存到外部持久设备上,在需要的时候还可以恢复。
2.对象持久化的原因(目标):// 是基础工作!是信息共享的主要原因物理:1) 内存不能持久,需要在硬盘上持久保存//(物理上,物理的都不是根本原因)2) 内存容量有限,需要在容量更大的硬盘上保存应用:3) 共享(Internet的本质:信息的收集、整理、发布) //最重要的原因4) 检索(大规模) //也很重要5) 管理(备份、安全)3.怎样进行对象持久化?(仅从JA V A方面讲)物理:1) 对象序列化2) DB技术(JDBC 数据库)4.怎样利用数据库做对象持久化?优点:功能完备、理论上效率高缺点:复杂(难)、代码量大、面向R(过程;二维表关系)2) EJB 仅讲Entity Bean优点:封装JDBC缺点:更复杂的API、重量级(侵入式)、功能不完备、难共享缺点的后果:开发周期长、测试困难、面向过程以上是2.0之前的版本,但3.0跟Hibernate基本一样3) ORM 轻量级框架(Hibernate)现阶段最佳的持久化工具:文档齐全、服务很好、工业标准、大量应用、易学优点:封装JBDC、简单的API、轻量级(只做持久化)(用类库)、PO(持久对象)->POJO(纯JA V A)、开源缺点:不够JDBC灵活5.结论:1)对象持久化是必须的2)必须使用DB来实现3)Hibernate必须的(现阶段最佳选择)开源工具的通常问题:1.文档不全;2.服务不全;3.标准化不够而Hibernate避免了所有这些问题二、ORM和Hibernate的相关知识(理解)1) ORM:Object Relational Mapping对象-关系映射实现了面向对象世界中对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。
2) Hibernate是非常优秀、成熟的O/R Mapping框架。
它提供了强大的对象和关系数据库映射以及查询功能。
规范:1.一个映射文件对应一个持久类(一一对应)2.映射文件的名字和它所描述的持久类的名字保持一致3.映射文件应该与它所描述的类在同一包中po -> (pojo)-> oid(唯一,中性)-> getters/setters-> 构造方法三、Hibernate核心API(理解)Configuration类:Configuration对象用于配置和启动Hibernate。
Hibernate应用通过Configuration实例来指定对象-关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。
SessionFactory接口:一个SessionFactory实例对应一个数据存储源。
应用从SessionFactory中获取Session 实例。
1)它是线程安全的,这意味着它的一个实例能够被应用的多个线程共享。
2)它是重量级的,这意味着不能随意创建或者销毁,一个数据库只对应一个SessionFactory。
通常构建SessionFactory是在某对象Bean的静态初始化代码块中进行。
如果应用只是访问一个数据库,只需创建一个SessionFactory实例,并且在应用初始化的时候创建该实例。
如果应用有同时访问多个数据库,则需为每个数据库创建一个单独的SessionFactory。
Session接口:是Hibernate应用最广泛的接口。
它提供了和持久化相关的操作,如添加,删除,更改,加载和查询对象。
1)它是线程不安全的,因此在设计软件架构时,应尽量避免多个线程共享一个Session实例。
2)Session实例是轻量级的,这意味着在程序可以经常创建和销毁Session对象,例如为每个客户请求分配单独的Session实例。
原则:一个线程一个Session;一个事务一个Session。
Transaction接口:是Hibernate的事务处理接口,它对底层的事务接口进行封装。
Query和Criteria接口:这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。
Query实例包装了一个HQL查询语句。
Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象。
Criteria更擅长于执行动态查询。
补充:find方法也提供数据查询功能,但只是执行一些简单的HQL查询语句的快捷方式(已过时),远没有Query接口强大!四、Hibernate开发步骤:(重点:必须掌握)开始:(设置环境变量和配置)在myeclipse里导入Hibernate的文件包(包括各数据库的驱动和其他的jar包,对版本敏感,注意各版本的兼容)按hibernate规范编写名字为hibernate.cfg.xml文件(默认放在工程文件夹下) 步骤一:设计和建立数据库表可以用Hibernate直接生成映射表。
Oracle里建表:create table t_ad (oid number(15) primary key,ACTNO varchar(20) not null unique,BALANCE number(20));步骤二:持久化类的设计POJO----POJO 在Hibernate 语义中理解为数据库表所对应的Domain Object。
(此类中只含有属性、构造方法、get/set方法)这里的POJO就是所谓的“Plain Ordinary Java Object”,字面上来讲就是无格式普通Java 对象,简单的可以理解为一个不包含逻辑代码的值对象(Value Object 简称VO)。
步骤三:持久化类和关系数据库的映射编写*.hbm.xml文件---该文件配置持久化类和数据库表之间的映射关系<class name=“POJO的类全路径”table=“对应的库表名”//这两项一定要配置,其它的都可以不配置discriminator-value=“discriminator_value”//区分不同子类的值,多态时使用。
默认与类名一样dynamic-update=“true | false”//是否动态更新SQL。
false:每次都更新所有属性;true:只更新修改的dynamic-insert=“true | false”//是否动态插入SQL。
false:每次都插入所有属性;true:只插入非空的select-before-update=“true | false”//是否在update前查询对象是否被修改过,修改过才updatepolymorphism=“implicit | explicit”//设置多态是显性(explicit)的还是隐性(implicit)的where=“查询时使用的SQL的条件子句”//查询时使用的SQL的条件子句lazy=“true | false”//设置延迟加载策略/>一个实体对应一个xml文件,组件用id,非组件用property。
*.hbm.xml文件样板:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN"""><hibernate-mapping package=".entity"><!--package指文件所在的包名--><class name="Account" table="student"><!-- name:POJO类的名; table数据库里对应的表名--><id name="oid" column="OID"><!-- OID:(唯一,中性)表自动生成的(需要另外添加hilo表) --><generator class="hilo"><param name="table">t_hi</param><param name="column">hi</param></generator></id><property name="actNo" column="ACTNO" unique="true" not-null="true"/><property name="bal" column="BALANCE" not-null="true"/></class></hibernate-mapping>步骤四:Hibernate配置文件hibernate.cfg.xml或hibernate.properties1.需要配置那些信息:持久化映射,方言,特性,登陆信息多数使用默认的设置。
A、dialect:方言,就是拼驱动程序和SQL语句。
每种数据库对应一种方言。
其实就是指定了用那一种数据库。
Oracle数据库方言:org.hibernate.dialect.OracleDialectMySql数据库方言:org.hibernate.dialect.MySQLDialectB、Object Persistence:对象持久化。
把内存中的数据保存到一个永久的介质中,比如说数据库。
C、ORM:对象关系映射,是一个自动的过程注:持久对象与临时对象最大的区别是有没有数据库id标识。
2.hibernate.cfg.xml的样板:<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN"""><hibernate-configuration><session-factory><!-- 数据库连接配置--><property name="connection.url">jdbc:mysql://localhost:3306/test</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="ername">root</property><property name="connection.password">password</property><!-- 自动建表语句:create覆盖旧表,update自动更新,none不理会--> <property name="hbm2ddl.auto">update</property><!-- 是否在控制台上打印SQL(Hibernate把语句转化为SQL语句),默认false--><property name="show_sql">true</property><!-- 缓存策略,数据量不大可不写--><propertyname="cache.provider_class">org.hibernate.cache.EhCacheProvider</property><property name="e_query_cache">false</property><property name="e_second_level_cache">false</property><!-- 不同数据库使用的SQL选择--><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="myeclipse.connection.profile">mysql</property><!-- 连接池配置,练习时不写,使用默认的--><property name="connection.pool_size">1</property><!--决定是采用thread或jta或自定义的方式来产生session,练习时不写,使用默认的--><property name="current_session_context_class">thread</property><!-- *.hbm.xml文件路径,各关联表要一同写上--><mapping resource="many_to_one/vo/Customer.hbm.xml" /><mapping resource="com/tarena/ebank/biz/entity/Order.hbm.xml" /></session-factory></hibernate-configuration>步骤五:使用Hibernate API//读取Hibernate.cfg.xml配置文件,并读到内存中为后续操作作准备Configuration config = new Configuration().configure();//SessionFactory缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。