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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
优点:生成标识符的机制不依赖于底层数据库,适用于所有的数据库系统。
2)Identity标识符生成器 • identity标识符生成器由底层数据库来负 责生成标识符,它要求底层数据库把主键 定义为自动增长字段类型,比如在MySql中 应为auto_increment,SQL Server中为 identity。 • 优缺点:必须依赖于底层数据库。

1)Increment标识符生成器
HIbernate会以自增的方式生成标识符,事实上是在hibernate的初始化阶段读取将要操 作的表中的最大的ID(select max(ID) from tableName),在向数据库中插入记录 时再在此基础上递增。 这样就会存在并发的问题:如果同时有两个hibernate进程读取 了这个最大值(假设为100),在向数据库中插入数据的时候都会想插入ID为101的记 录,这样就违反了数据库的约束。这个问题只要是存在两个sessionFacotry就会发生, 不能在集群下使用。
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用来访问属性值的策略。
第二章 Hibernate API
目标: •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" />
• 判断一个实体对象是否处于瞬态: 判断一个实体对象是否处于瞬态: 该实体对象的<id>属性(如果存在)的值为空 如果在映射文件中为<id>设置了unsaved-value属性,并且实体 对象的id属性的值与unsaved-value属性的值相同 如果这个实体对象配置version属性,并且version属性的空 在映射文件中为version属性设置了unsaved-value属性,并且version 属性的值与unsaved-value属性的值相同。 如果设置了interceptor,并且interceptor的isUnsaved()方法 的返回值为true 满足上述条件的实体对象就处于瞬态,否则为游离态(前提是不处于持 久态)
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>
Sessin 接口
• • • • • Save Update Delete Load find
Hibernate对象的生命周期
(1)瞬态:表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联 )瞬态 数据库中的数据没有任何的关联即, 数据库中的数据没有任何的关联 该实体从未与任何持久化上下文联系过,没有持久化标识(相当与主键)。瞬态实体的特征有: 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录 与Session没有任何关 系,也就是没有通过Session对象的实例对其进行任何持久化的操作。 (2)持久态 )持久态:指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对 象的实例相关的。处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被 处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被Hibernate 处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被 持久化到数据库中。 持久化到数据库中。处于持久态的对象具有的特征为: 每个持久态对象都于一个Session对象关联 处于持久态的对象是于数据库中的记录相关联的 Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录 (3)游离态 )游离态:处于持久态的实体对象,当他不再与Session对象关联时,这个对象就变成了游离态。。 游离态对象的特征有: 游离态对象一定是由持久态对象转换而来 游离态实体不再于Session关联 游离态实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据 库中的数据 游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)
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): 表明此属性值是否实际上是由数据库生成 的
Configuration 接口:配置Hibernate,根启动Hibernate,创建 sessionFactory对象。 Query和Criteria 接口:执行数据库查询.
在java应用hibernate步骤
1. 2. 3. 4. 创建Hibernate 的配置文件。 创建持久化类 创建对象-关系映射文件 通过Hibernate API 访问数据库的代码
源自文库
• Properties p = configuration.getProperties(); • System.out.println("---" + p); • p.put("hibernate.default_schema", newSchema); • sessionFactory = configuration.buildSessionFactory();
• 3)sequence标识符生成器 • sequence标识符生成器利用底层数据库 提供的序列来生成标识符(需要在数据库 中创建一个序列)。
• 4)Native标识符生成器 native标识符生成器依据底层数据库对自动 生成标识符的支持能力,来选择适用 identity,sequence,hilo标识符生成器。 native能自动判读底层数据库提供的生成符 native 机制,如果为MySQL和SQL Server为 identity,如果数据库为Oracle则为 sequence。 • 5)assigned标识符生成器 由程序指定OID。
相关文档
最新文档