最经典的hibernate教程_从入门到精通_第二篇(共四篇)
经典heibernate教程从入门到精通CSTPHibernate02(第二篇共四篇)PPT课件

• Transation:功能上和数据库中的事务完全一样,通过它实现对数据库中事 务的控制。Transation对象是Session对象产生的,所以他的生命周期比 Session短。一个Session的生命周期中可以有多个Transaction对象。
• ConnectonProvider:主要作用是生成与数据库建立了连接的JDBC对象, 同时他还作为数据库连接的缓冲池。通过ConnectionProvider实现了应用程 序和底层的DataSource和DriverManager的隔离。
10
11
1)Increment标识符生成器
HIbernate会以自增的方式生成标识符,事实上是在hibernate的初始化阶段读取将要操 作的表中的最大的ID(select max(ID) from tableName),在向数据库中插入记录 时再在此基础上递增。 这样就会存在并发的问题:如果同时有两个hibernate进程读取 了这个最大值(假设为100),在向数据库中插入数据的时候都会想插入ID为101的记 录,这样就违反了数据库的约束。这个问题只要是存在两个sessionFacotry就会发生, 不能在集群下使用。
• TransactionFactory:是生成Transaction对象的工厂,通过
4
TransactionFactory实现了事务的封装,使其具体的实现方法与应用程序无关
Configuration 接口:配置Hibernate,根启动Hibernate,创建 。 sessionFactory对象
第二章 Hibernate API
目标: •Hibernate API
1
整体概述
概况一
点击此处输入相关文本内容 点击此处输入相关文本内容
Hibernate 学习教程大纲

Hibernate 学习教程第1课课程内容. 6第2课Hibernate UML图. 6第3课风格. 7第4课资源. 7第5课环境准备. 7第6课第一个示例HibernateHelloWorld 7第7课建立Annotation版本的HellWorld 9第8课什么是O/RMapping 11一、定义:. 11二、 Hibernate的创始人:. 11三、 Hibernate做什么:. 12四、 Hibernate存在的原因:. 12五、 Hibernate的优缺点:. 12六、 Hibernate使用范围:. 12第9课Hibernate的重点学习:Hibernate的对象关系映射. 12一、对象---关系映射模式. 12二、常用的O/R映射框架:. 13第10课模拟Hibernate原理(OR模拟) 13一、项目名称. 13二、原代码. 13第11课Hibernate基础配置. 15一、提纲. 15二、介绍MYSQL的图形化客户端. 16三、 Hibernate.cfg.xml:hbm2ddl.auto 16四、搭建日志环境并配置显示DDL语句. 16五、搭建Junit环境. 16六、 ehibernate.cfg.xml : show_sql 17七、 hibernate.cfg.xml :format_sql 17八、表名和类名不同,对表名进行配置. 17九、字段名和属性相同. 17十、字段名和属性名不同. 17十一、不需要(持久化)psersistence的字段. 18十二、映射日期与时间类型,指定时间精度. 18十三、映射枚举类型. 19第12课使用hibernate工具类将对象模型生成关系模型. 19第13课ID主键生成策略. 20一、 Xml方式. 20<generator>元素(主键生成策略) 20二、 annotateon方式. 211、AUTO默认. 212、IDENTITY 223、SEQUENCE 224、为Oracle指定定义的Sequence 225、TABLE - 使用表保存id值. 23三、联合主键. 241、xml方式. 242、annotation方式. 27第14课Hibernate核心开发接口(重点) 29一、 Configuration(AnnotationConfiguration) 29二、 SessionFactory 29三、 Session 291、管理一个数据库的任务单元. 292、 save(); 293、 delete() 294、 load() 295、 Get() 306、 load()与get()区别. 317、 update() 318、 saveOrUpdate() 329、 clear() 3210、 flush() 3311、 evict() 33第15课持久化对象的三种状态. 35一、瞬时对象(TransientObject):. 35二、持久化对象(PersistentObject):. 35三、离线对象(DetachedObject):. 35四、三种状态的区分:. 35五、总结:. 35第16课关系映射(重点) 36一、一对一关联映射. 36(一) 唯一外键关联-单向(unilateralism) 37(二) 唯一外键关联-双向. 40(三) 主键关联-单向(不重要) 41(四) 主键关联-双向(不重要) 44(五) 联合主键关联(Annotation方式) 44二、 component(组件)关联映射. 45(一) Component关联映射:. 45(二) User实体类:. 45(三) Contact值对象:. 46(四) xml--User映射文件(组件映射):. 46(五) annotateon注解. 46(六) 导出数据库输出SQL语句:. 47(七) 数据表结构:. 47(八) 组件映射数据保存:. 47三、多对一–单向. 48(一) 对象模型图:. 48(二) 关系模型:. 48(三) 关联映射的本质:. 48(四) 实体类. 48(五) xml方式:映射文件:. 49(六) annotation 50(七) 多对一存储(先存储group(对象持久化状态后,再保存user)):. 50(八) 重要属性-cascade(级联):. 51(九) 多对一加载数据. 51四、一对多- 单向. 51(一) 对象模型:. 52(二) 关系模型:. 52(三) 多对一、一对多的区别:. 52(四) 实体类. 52(五) xml方式:映射. 52(六) annotateon注解. 53(七) 导出至数据库(hbmàddl)生成的SQL语句:. 53(八) 一对多单向存储实例:. 53(九) 生成的SQL语句:. 54(十) 一对多,在一的一端维护关系的缺点:. 54 (十一) 一对多单向数据加载:. 54(十二) 加载生成SQL语句:. 54五、一对多- 双向. 54(一) xml方式:映射. 55(二) annotateon方式注解. 55(三) 数据保存:. 56(四) 关于inverse属性:. 56(五) Inverse和cascade区别:. 56(六) 一对多双向关联映射总结:. 57六、多对多- 单向. 57(一) 实例场景:. 57(二) 对象模型:. 57(三) 关系模型:. 57(四) 实体类. 57(五) xml方式:映射. 58(六) annotation注解方式. 58(七) 生成SQL语句. 59(八) 数据库表及结构:. 59(九) 多对多关联映射单向数据存储:. 59(十) 多对多关联映射单向数据加载:. 61七、多对多- 双向. 61(一) xml方式:映射. 61(二) annotation注解方式. 62八、关联关系中的CRUD_Cascade_Fetch 63九、集合映射. 63十、继承关联映射. 64(一) 继承关联映射的分类:. 64(二) 对象模型:. 64(三) 单表继承SINGLE_TABLE:. 64(四) 具体表继承JOINED:. 70(五) 类表继承TABLE_PER_CLASS 72(六) 三种继承关联映射的区别:. 74第17课hibernate树形结构(重点) 75一、节点实体类:. 75二、 xml方式:映射文件:. 75三、 annotation注解. 76四、测试代码:. 76五、相应的类代码:. 76第18课作业-学生、课程、分数的映射关系. 79一、设计. 79二、代码:. 79三、注意. 80第19课Hibernate查询(Query Language) 80一、 Hibernate可以使用的查询语言. 80二、实例一. 80三、实体一测试代码:. 82四、实例二. 86五、实例二测试代码. 87第20课Query by Criteria(QBC) 89一、实体代码:. 89二、 Restrictions用法. 90三、工具类Order提供设置排序方式. 91四、工具类Projections提供对查询结果进行统计与分组操作. 91五、 QBC分页查询. 92六、 QBC复合查询. 92七、 QBC离线查询. 92第21课Query By Example(QBE) 92一、实例代码. 92第22课Query.list与query.iterate(不太重要) 93一、 query.iterate查询数据. 93二、 query.list()和query.iterate()的区别. 94三、两次query.list() 94第23课性能优化策略. 95第24课hibernate缓存. 95一、 Session级缓存(一级缓存) 95二、二级缓存. 951、二级缓存的配置和使用:. 962、二级缓存的开启:. 963、指定二级缓存产品提供商:. 964、使用二级缓存. 975、应用范围. 996、二级缓存的管理:. 997、二级缓存的交互. 1008、总结. 102三、查询缓存. 102四、缓存算法. 103第25课事务并发处理. 104一、数据库的隔离级别:并发性作用。
Hibernate教程

主键生成策略(续)
sequence 采用数据库提供的sequence机制生成主键,如Oracle Sequence native 由Hibernate根据数据库适配器中的定义,自动采用identity、hilo、 sequence的其中一种作为主键生成方式
uuid.hex
由Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启 动时间,内部自增量等4个参数生成十六进制数值(编码后以长度为32位的字 符串表示)作为主键。利用uuid.hex方式生成主键将提供最好的数据插入性 能和数据库平台适应性 uuid.String 与uuid.hex类似,只是生成的主键不进行编码(长度16位)
Data Classes
Hibernate过程及原理
设计实体类(简单的Java对象,Plain Old Java Objects, POJO) 通过注解或者xml文件定义实体类和数据 库表的映射关系 Hibernate框架根据映射关系定义和数据库 配置动态生成SQL语句,通过JDBC来执 行SQL语句
Transaction tx2=session2.beginTransaction(); session2.update(user); 4. 此时处于Detached状态的user对象 再次借助session2由Hibernate纳入管
user.setName(“Jonh_2”);
mit();
Persistent
close() * clear() * evict() update saveOrUpdate lock
garbage
Detached
* 对session里的所有实体对象都有效
VO和PO
从实体对象是否被纳入Hibernate实体管理容器的角度, Transient和Detached状态的实体对象可以统称为VO(Value Object),而被管理的实体对象称为PO(Persistent Object)。 两者的区别: 1.VO是相对独立的实体对象,处于非管理状态。
Hibernate教程---看这一篇就够了

Hibernate教程---看这⼀篇就够了1 Hibernate概述1.1什么是hibernate框架(重点)1 hibernate框架应⽤在javaee三层结构中 dao层框架2 在dao层⾥⾯做对数据库crud操作,使⽤hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进⾏封装,使⽤hibernate好处,不需要写复杂jdbc代码了,不需要写sql语句实现3 hibernate开源的轻量级的框架4 hibernate版本Hibernate3.xHibernate4.xHibernate5.x(学习)1.2 什么是orm思想(重点)1 hibernate使⽤orm思想对数据库进⾏crud操作2 在web阶段学习 javabean,更正确的叫法实体类3 orm:object relational mapping,对象关系映射⽂字描述:(1)让实体类和数据库表进⾏⼀⼀对应关系让实体类⾸先和数据库表对应让实体类属性和表⾥⾯字段对应(2)不需要直接操作数据库表,⽽操作表对应实体类对象画图描述2 Hibernate⼊门2.1 搭建hibernate环境(重点)第⼀步导⼊hibernate的jar包因为使⽤hibernate时候,有⽇志信息输出,hibernate本⾝没有⽇志输出的jar包,导⼊其他⽇志的jar包不要忘记还有mysql驱动的jar包第⼆步创建实体类package cn.itcast.entity;public class User {/*hibernate要求实体类有⼀个属性唯⼀的*/// private int uid;private String uid;private String username;private String password;private String address;// public int getUid() {// return uid;// }// public void setUid(int uid) {// this.uid = uid;// }public String getUsername() {return username;}public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}(1)使⽤hibernate时候,不需要⾃⼰⼿动创建表,hibernate帮把表创建第三步配置实体类和数据库表⼀⼀对应关系(映射关系)使⽤配置⽂件实现映射关系(1)创建xml格式的配置⽂件- 映射配置⽂件名称和位置没有固定要求- 建议:在实体类所在包⾥⾯创建,实体类名称.hbm.xml(2)配置是是xml格式,在配置⽂件中⾸先引⼊xml约束- 学过约束dtd、schema,在hibernate⾥⾯引⼊的约束dtd约束(3)配置映射关系<hibernate-mapping><!-- 1 配置类和表对应class标签name属性:实体类全路径table属性:数据库表名称--><class name="er" table="t_user"><!-- 2 配置实体类id和表id对应hibernate要求实体类有⼀个属性唯⼀值hibernate要求表有字段作为唯⼀值--><!-- id标签name属性:实体类⾥⾯id属性名称column属性:⽣成的表字段名称--><id name="uid" column="uid"><!-- 设置数据库表id增长策略native:⽣成表id值就是主键⾃动增长--><generator class="native"></generator></id><!-- 配置其他属性和表字段对应name属性:实体类属性名称column属性:⽣成表字段名称--><property name="username" column="username"></property><property name="password" column="password"></property><property name="address" column="address"></property></class></hibernate-mapping>第四步创建hibernate的核⼼配置⽂件(1)核⼼配置⽂件格式xml,但是核⼼配置⽂件名称和位置固定的- 位置:必须src下⾯- 名称:必须hibernate.cfg.xml(2)引⼊dtd约束(3)hibernate操作过程中,只会加载核⼼配置⽂件,其他配置⽂件不会加载第⼀部分:配置数据库信息必须的第⼆部分:配置hibernate信息可选的第三部分:把映射⽂件放到核⼼配置⽂件中<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 第⼀部分:配置数据库信息必须的 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="ername">root</property><property name="hibernate.connection.password">root</property><!-- 第⼆部分:配置hibernate信息可选的--><!-- 输出底层sql语句 --><property name="hibernate.show_sql">true</property><!-- 输出底层sql语句格式 --><property name="hibernate.format_sql">true</property><!-- hibernate帮创建表,需要配置之后update: 如果已经有表,更新,如果没有,创建--><property name="hibernate.hbm2ddl.auto">update</property><!-- 配置数据库⽅⾔在mysql⾥⾯实现分页关键字 limit,只能使⽤mysql⾥⾯在oracle数据库,实现分页rownum让hibernate框架识别不同数据库的⾃⼰特有的语句--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 第三部分:把映射⽂件放到核⼼配置⽂件中必须的--><mapping resource="cn/itcast/entity/User.hbm.xml"/></session-factory></hibernate-configuration>2.2 实现添加操作第⼀步加载hibernate核⼼配置⽂件第⼆步创建SessionFactory对象第三步使⽤SessionFactory创建session对象第四步开启事务第五步写具体逻辑 crud操作第六步提交事务第七步关闭资源@Testpublic void testAdd() {// 第⼀步加载hibernate核⼼配置⽂件// 到src下⾯找到名称是hibernate.cfg.xml//在hibernate⾥⾯封装对象Configuration cfg = new Configuration();cfg.configure();// 第⼆步创建SessionFactory对象//读取hibernate核⼼配置⽂件内容,创建sessionFactory//在过程中,根据映射关系,在配置数据库⾥⾯把表创建SessionFactory sessionFactory = cfg.buildSessionFactory(); // 第三步使⽤SessionFactory创建session对象// 类似于连接Session session = sessionFactory.openSession();// 第四步开启事务Transaction tx = session.beginTransaction();// 第五步写具体逻辑 crud操作//添加功能User user = new User();user.setUsername("⼩王");user.setPassword("250");user.setAddress("⽇本");//调⽤session的⽅法实现添加session.save(user);// 第六步提交事务mit();// 第七步关闭资源session.close();sessionFactory.close();}3 内容⽬录1 实体类编写规则2 hibernate主键⽣成策略(1)native(2)uuid3 实体类操作(1)crud操作(2)实体类对象状态4 hibernate的⼀级缓存5 hibernate的事务操作(1)事务代码规范写法6 hibernate其他的api(查询)(1)Query(2)Criteria(3)SQLQuery3.1 实体类编写规则1 实体类⾥⾯属性私有的2 私有属性使⽤公开的set和get⽅法操作3 要求实体类有属性作为唯⼀值(⼀般使⽤id值)4 实体类属性建议不使⽤基本数据类型,使⽤基本数据类型对应的包装类(1)⼋个基本数据类型对应的包装类- int – Integer- char—Character、- 其他的都是⾸字母⼤写⽐如 double – Double(2)⽐如表⽰学⽣的分数,假如 int score;- ⽐如学⽣得了0分,int score = 0;- 如果表⽰学⽣没有参加考试,int score = 0;不能准确表⽰学⽣是否参加考试l 解决:使⽤包装类可以了, Integer score = 0,表⽰学⽣得了0分,表⽰学⽣没有参加考试,Integer score = null;3.2 Hibernate主键⽣成策略1 hibernate要求实体类⾥⾯有⼀个属性作为唯⼀值,对应表主键,主键可以不同⽣成策略2 hibernate主键⽣成策略有很多的值3 在class属性⾥⾯有很多值(1)native:根据使⽤的数据库帮选择哪个值(2)uuid:之前web阶段写代码⽣成uuid值,hibernate帮我们⽣成uuid值3.3 实体类操作对实体类crud操作添加操作1 调⽤session⾥⾯的save⽅法实现根据id查询1 调⽤session⾥⾯的get⽅法实现修改操作1 ⾸先查询,修改值(1)根据id查询,返回对象删除操作1 调⽤session⾥⾯delete⽅法实现3.4 实体类对象状态(概念)1 实体类状态有三种(1)瞬时态:对象⾥⾯没有id值,对象与session没有关联(2)持久态:对象⾥⾯有id值,对象与session关联(3)托管态:对象有id值,对象与session没有关联2 演⽰操作实体类对象的⽅法(1)saveOrUpdate⽅法:实现添加、实现修改3.5 Hibernate的⼀级缓存什么是缓存1 数据存到数据库⾥⾯,数据库本⾝是⽂件系统,使⽤流⽅式操作⽂件效率不是很⾼。
hibernate官方新手教程(转载)

hibernate官⽅新⼿教程(转载)hibernate官⽅新⼿教程第⼀部分-第⼀个Hibernate程序⾸先我们将创建⼀个简单的控制台(console-based)Hibernate程序。
我们使⽤内置数据库(in-memory database) (HSQL DB),所以我们不必安装不论什么数据库server。
让我们如果我们希望有⼀个⼩程序能够保存我们希望关注的事件(Event)和这些事件的信息。
(译者注:在本教程的后⾯部分,我们将直接使⽤Event⽽不是它的中⽂翻译“事件”,以免混淆。
)我们做的第⼀件事是建⽴我们的开发⽂件夹,并把全部须要⽤到的Java库⽂件放进去。
从Hibernate站点的下载页⾯下载Hibernate分发版本号。
解压缩包并把/lib以下的全部库⽂件放到我们新的开发⽂件夹以下的/lib⽂件夹以下。
看起来就像这样:.+libantlr.jarcglib-full.jarasm.jarasm-attrs.jarscommons-collections.jarcommons-logging.jarehcache.jarhibernate3.jarjta.jardom4j.jarlog4j.jarThis is the minimum set of required libraries (note that we also copied hibernate3.jar, the main archive) for Hibernate. See the README.txt file in the lib/ directory of the Hibernate distribution for more information about required and optional third-party libraries. (Actually, Log4j is not required but preferred by many developers.) 这个是Hibernate执⾏所须要的最⼩库⽂件集合(注意我们也拷贝了Hibernate3.jar,这个是最重要的库)。
hibernate完美培训教程课件

hibernate完美培训教程
11
Hibernate核心接口
hibernate完美培训教程
12
Configuration
➢ 概述:Configuration 类负责管理Hibernate 的配置信息。它包括
hibernate.connection.url jdbc:mysql://localhost/hibernate
ername root
hibernate.connection.password ➢ 数据库连接池的配置-DBCP(App Server连接池首选)
如果是集合类型的属性,它的类型必须定义为集合的接口。例如: List、Set。
提供一个标识属性(identifier property)。如果没有该属性,一些 功能不起作用,比如:级联更新(Cascaded updates) Session.saveOrUpdate()。
hibernate完美培训教程
目录
一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践
hibernate完美培训教程
1
一、持久化层-O/R Mapping
primary key (name)
1:n/n:1 n:m
外键 关联表
)
继承
单表继承、具体表继承、
类表继承
hibernate完美培训教程
3
对象—关系数据库的不匹配范式
Hibernate教程_204页-最全汇总

public void setId(Long id) { this.id = id; }
public String getName() { return name; }
Hibernate入门
❖ 创建表
create table CUSTOMER( ID Integer primary key, NAME varchar2(15) not null, EMAIL varchar2(128) not null, PASSWORD varchar2(8) not null, PHONE varchar2(20), ADDRESS varchar2(255), SEX char(2), IS_MARRIED char(1), DESCRIPTION clob, IMAGE blob, BIRTHDAY date, REGISTERED_TIME timestamp
</id>
<property> <property name="email" column="EMAIL" type="string" not-null="true" />
Hibernate入门
❖ java、hibernate、sql类型对应关系
Customer类属性 java
Name
ng.String
效率。
第一章 Java对象持久化概述
❖ 应用程序的分层体系结构 Java应用的持久化层
表述层 业务逻辑层
数据库层
表述层 业务逻辑层 持久化层
数据库层
第一章 Java对象持久化概述 ❖ Hibernate中间件特性
Hibernate教程讲师用-23页精选文档

Hibernate教程前言1、 java对象持久化技术1.1 、hibernate是什么1.2、软件模型1.2.1、概念模型1.2.2、关系数据模型1.2.3、域模型1.2.4、域对象1.2.5、域对象之间的关系1.2.6、域对象的持久化概念提示:1.3、数据库访问模式1.3.1、ORM模式1.3.2、主动域对象模式1.3.3、JDO模式1.3.4、CMP模式一、数据源层-O/R Mapping主要介绍三层架构,如何分层?(逻辑上的分层,二个原则)数据层技术的选择:直接使用1.1、SQL/JDBC:优点:很多开发者熟悉关系数据库管理系统,理解SQL,也知道如何使用表和外键进行工作。
此外,他们可以始终使用众所周知并广泛使用的DAO设计模式对业务逻辑隐藏复杂的JDBC代码和不可移植的SQL。
缺点:为域中的每个类手工编写持续性代码的工作是非常可观的,特别是需要支持多种SQL方言时。
这项工作通常会消耗很大一部分的开发努力。
此外,当需求改变时,一个手工编码的解决方案总是需要更多的注意和维护努力。
1.2、序列化:Java有一个内建的持久化机制:序列化提供了将对象图(应用状态)写到字节流中的能力,然后它可能被持久化到文件或数据库中。
持久化也被Java的远程方法调用(RMI)使用来为复杂对象传递值语义。
持久化的另一种用法是在机器集群中跨节点复制应用状态。
缺点:很不幸,一个相互连接的对象图在序列化之后只能被当作一个整体访问,如果不反序列化整个流就不可能从流中取出任何数据。
这样,结果字节流肯定会被认为不适合进行任意的检索或聚合。
甚至不可能独立地访问或更新一个单独的对象或子图。
非常明显,因为当前特定的技术,序列化不适合于作为高并发性的Web和企业应用的持久化机制。
在特定的环境中它被作为桌面应用的适当的持久化机制。
1.3EJB entity beansEJB1.1实体Bean在实践中彻底地失败了。
EJB规范的设计缺陷阻碍了Bean管理的持续性(BMP)实体Bean有效地执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
பைடு நூலகம்目标: •Hibernate API简介0
Hinernate的体系结构(运行时) 的体系结构(运行时) 的体系结构
•
•
•
•
•
SessionFactory:它保存了对当前数据库配置的所有映射关系,它是将某个 数据库的映射关系经过编译之后全部保存在内存中的。 它还是生成Session 的工厂,它在进行实例化的过程中将会用到ConnectionProvider。一个 SessionFactory对应一个数据库连接,当数据库连接改变时需要修改 SessionFactory Sesion: 是进行持久化操作的基础,所有的持久化操作都是在Session的基 础上进行的。它相当与JDBC中的Connection。它是Hibernate的持 久化管理 器的核心,提供了一系列的持久化操作方法。另外,它还持有一个针对持久 化对象的一级缓存,在遍历持久化对象或者根据持久化标识查找对象的时候 会用 到。 Transation:功能上和数据库中的事务完全一样,通过它实现对数据库中事 务的控制。Transation对象是Session对象产生的,所以他的生命周期比 Session短。一个Session的生命周期中可以有多个Transaction对象。 ConnectonProvider:主要作用是生成与数据库建立了连接的JDBC对象, 同时他还作为数据库连接的缓冲池。通过ConnectionProvider实现了应用程 序和底层的DataSource和DriverManager的隔离。 TransactionFactory:是生成Transaction对象的工厂,通过 TransactionFactory实现了事务的封装,使其具体的实现方法与应用程序无关 。
<property name="propertyName" column="column_name" type="typename" update="true|false" insert="true|false" formula="arbitrary SQL expression" access="field|property|ClassName" lazy="true|false" unique="true|false" not-null="true|false" optimisticlock="true|false" generated="never|insert|always" node="element-name|@attributename|element/@attribute|." index="index_name" unique_key="unique_key_id" length="L" precision="P" scale="S" />
Sessin 接口
• • • • • Save Update Delete Load find
Hibernate对象的生命周期
(1)瞬态:表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联 )瞬态 数据库中的数据没有任何的关联即, 数据库中的数据没有任何的关联 该实体从未与任何持久化上下文联系过,没有持久化标识(相当与主键)。瞬态实体的特征有: 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录 与Session没有任何关 系,也就是没有通过Session对象的实例对其进行任何持久化的操作。 (2)持久态 )持久态:指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对 象的实例相关的。处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被 处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被Hibernate 处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被 持久化到数据库中。 持久化到数据库中。处于持久态的对象具有的特征为: 每个持久态对象都于一个Session对象关联 处于持久态的对象是于数据库中的记录相关联的 Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录 (3)游离态 )游离态:处于持久态的实体对象,当他不再与Session对象关联时,这个对象就变成了游离态。。 游离态对象的特征有: 游离态对象一定是由持久态对象转换而来 游离态实体不再于Session关联 游离态实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据 库中的数据 游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)
优点:生成标识符的机制不依赖于底层数据库,适用于所有的数据库系统。
2)Identity标识符生成器 • identity标识符生成器由底层数据库来负 责生成标识符,它要求底层数据库把主键 定义为自动增长字段类型,比如在MySql中 应为auto_increment,SQL Server中为 identity。 • 优缺点:必须依赖于底层数据库。
• 3)sequence标识符生成器 • sequence标识符生成器利用底层数据库 提供的序列来生成标识符(需要在数据库 中创建一个序列)。
• 4)Native标识符生成器 native标识符生成器依据底层数据库对自动 生成标识符的支持能力,来选择适用 identity,sequence,hilo标识符生成器。 native能自动判读底层数据库提供的生成符 native 机制,如果为MySQL和SQL Server为 identity,如果数据库为Oracle则为 sequence。 • 5)assigned标识符生成器 由程序指定OID。
•
1)Increment标识符生成器
HIbernate会以自增的方式生成标识符,事实上是在hibernate的初始化阶段读取将要操 作的表中的最大的ID(select max(ID) from tableName),在向数据库中插入记录 时再在此基础上递增。 这样就会存在并发的问题:如果同时有两个hibernate进程读取 了这个最大值(假设为100),在向数据库中插入数据的时候都会想插入ID为101的记 录,这样就违反了数据库的约束。这个问题只要是存在两个sessionFacotry就会发生, 不能在集群下使用。
• Properties p = configuration.getProperties(); • System.out.println("---" + p); • p.put("hibernate.default_schema", newSchema); • sessionFactory = configuration.buildSessionFactory();
Hibernate 配置文件
持久化类
• JavaBean implements Serializable
创建对象-关系映射文件
• <hibernate-mapping> • <class > • <id> • <column name="compid" /> • <generator class="native" /> • </id> • <property name="" type=""> • <column name="" length="" /> • </property> • </class> • </hibernate-mapping>
Configuration 接口:配置Hibernate,根启动Hibernate,创建 sessionFactory对象。 Query和Criteria 接口:执行数据库查询.
在java应用hibernate步骤
1. 2. 3. 4. 创建Hibernate 的配置文件。 创建持久化类 创建对象-关系映射文件 通过Hibernate API 访问数据库的代码
ID
<id name="propertyName" type="typename" column="column_name" unsavedvalue="null|any|none|undefined|id_value" access="field|property|ClassName" node="element-name|@attribute-name|element/@attribute|."> <generator class="generatorClass"/> </id> • • • • name (可选): 标识属性的名字。 type (可选): 标识Hibernate类型的名字。 column (可选 - 默认为属性名): 主键字段的名字。 unsaved-value (可选 - 默认为一个切合实际(sensible)的值): 一个特定的标识属性值 ,用来标志该实例是刚刚创建的,尚未保存。 这可以把这种实例和从以前的session中 装载过(可能又做过修改--译者注) 但未再次持久化的实例区分开来。 access (可选 - 默认为property): Hibernate用来访问属性值的策略。
name: 属性的名字,以小写字母开头。 column (可选 - 默认为属性名字): 对应的数据库字段名。 也可以通过嵌套的 <column>元素指定。 type (可选): 一个Hibernate类型的名字。 update, insert (可选 - 默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL 语句中是否包含这个被映射了的字段。这二者如果都设置为false 则表明这是 一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。 formula (可选): 一个SQL表达式,定义了这个计算 (computed) 属性的值。 计算属性没有和它对应的数据库字段。 access (可选 - 默认值为 property): Hibernate用来访问属性值的策略。 lazy (可选 - 默认为 false): 指定 指定实例变量第一次被访问时,这个属性是 否延迟抓取(fetched lazily)( 需要运行时字节码增强)。 unique (可选): 使用DDL为该字段添加唯一的约束。 同样,允许它作为 property-ref引用的目标。 not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。 optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得 乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本 (version)的值是否增长。 generated (可选 - 默认为 never): 表明此属性值是否实际上是由数据库生成 的