`

hibernate规则

 
阅读更多

实体类的编写规则

l        实体类必须具备无参构造方法

l        实体类必须具备数据库标识

l        通常选用无业务意义的逻辑主键作为数据库标识,通常是int/long/String类型

l        通常由Hibernate来自动生成数据库标识值

n        比较常见的策略包括:

u      Int/long或short类型:identity,sequence,hilo,native

u      String类型:uuid

u      手工分配:assigned

u      一对一关联映射中使用:foreign

 

Session对实体对象的管理

l        瞬时对象是没有数据库标识,没有被任何session所管理,数据库没有对应的记录的对象

l        持久化对象是被某个session管理,而且必定拥有数据库标识,在数据库中有对应的记录

l        离线对象是拥有数据库标识,没有被session所管理的对象,而且在数据库中也有对应的记录

l        Save方法用于将一个实体对象从瞬时状态转换为持久化状态

l        Update方法用于将一个实体对象从离线状态转换为持久化状态

l        saveOrUpdate方法由Hibernate自动判断

n        如果对象处于离线状态(拥有数据库标识),将自动执行update操作

n        如果对象处于瞬时状态(无数据库标识值),将自动执行save操作

l        Flush方法用于将内存中由session管理的持久化对象的状态强制同步到数据库(发出insert/update/delete语句)

l        Evict方法用于将一个持久化对象转换为离线对象

l        Clear方法用于将session中所管理的所有持久化对象转换为离线对象

l        Merge方法用于把一个离线对象的属性值拷贝到跟它相对应的持久化对象中

l        Hibernate会尽可能的延迟SQL语句的发出(insert/update/delete/select)

l        同一个session中,不允许存在两个以上具有相同数据库标识的同种类型的实体对象

l        处于持久化状态的对象,不允许引用到一个瞬时对象

l        懒加载策略只在session打开期间有效(即只对处于持久化状态的实体对象有效),如果尝试获得一个离线对象中尚未被加载的属性,将会抛出懒加载异常!

 

关联映射

l        关于equals和hashcode方法

n        如果需要对集合中的实体对象进行管理,需要重写equals和hashcode方法

n        重写这两个方法的时候,如果数据库标识是自动生成的(非assigned策略),最好不要根据数据库标识来重写!

n        最好是根据实体类中具备如下特征的属性来生成equals和hashcode方法

u      非空

u      唯一

l        在一对多双向关联中,通常设置“一”的一端inverse=”true”(这意味着我们通常在“多”的一端维护关联

n        Inverse属性只用于双向关联

n        而且只能设置在“一”的一端(在“多”的一端根本没有inverse属性),换句话来说,在多的一端,永远都是可以维护关联的

l        在一对多双向关联中,其外键字段名请保持一致

l        在Hibernate中,实体类的集合类型请使用接口定义(如:Set、List、Map),而不要使用具体的实现类型(如:HashSet、ArrayList、HashMap)

l        多对多关联通常会拆分成两个多对一关联

l        单表继承映射的限制

n        子类型的属性不能定义为not-null=”true”

l        具体类表继承(union-subclass)映射策略的限制

n        不能使用identity生成策略!

HQL查询

l        HQL是面向对象的查询语句,在HQL语句中,使用类名、属性名来进行查询(而不是表名、字段名)

l        注意HQL语句的大小写敏感性

n        类名和属性名是大小写敏感的,其它字符(比如关键字:select/from/where/order by group by等)是大小写不敏感的

l        用?来表示索引参数,给参数赋值时,从第0个索引开始赋值

l        用“:参数名称”的方式,在HQL语句中,定义命名参数,赋值时,直接按照名称赋值

l        空值查询,建议使用is null来判断空值

l        可以使用集合(或数组)作为参数传给HQL语句,注意使用setParameterList方法

n        集合(或数组)不能为null或empty

l        传递的参数类型必须与属性的数据类型匹配

l        在HQL语句中,不能使用select* from ... 这样的语法!

l        投影查询(查询部分属性)

n        如果查询多个属性,则返回的List中的元素是Object[]数组类型

n        如果查询单个属性,则返回的List中的元素是这个属性对应的类型

l        SQL语法中的统计函数可以在HQL语句中直接使用

l        假如查询的结果集至多只有一条记录,则可以调用Query中的uniqueResult方法直接把对象取出

l        可以将查询结果集转换为各种不同类型的对象

n        转换为一个实体类(注意,需定义相应的构造方法)

u      比如:select new Person(p.id,p.name,p.address) from Person p

n        转换为其它类型的VO对象(注意,使用全路径类名,并定义相应的构造方法)

u      比如:select new cn.com.leadfar.vo.PersonVO(p.id,p.name) from Person p

n        转换为Map类型(每个Map对象就代表了一条记录,属性的别名作为Map对象中的key,属性的值就是相对应的值)

u      比如:select new map(p.id as pid,p.name as pname) from Person p

n        转换为List类型

u      比如:select new list(p.id,p.name) from Person p

l        多态查询

n        在HQL语句中,直接通过基类型的名称,可以把所有属于此基类型的对象查出

n        也可以通过接口或抽象类来进行查询

l        分页查询

n        Query.setFirstResult 从第几条记录开始查询

n        Query.setMaxResults 最大返回几条记录

l        Query.iterate()方法

n        如果查询的是实体对象,Hibernate会先发一条语句查询ID列表,当迭代访问其中的实体对象时,Hibernate再次根据ID逐个发出SQL语句查询实体对象(N+1查询问题)

n        如果查询的不是实体对象(比如:select p.id,p.name from Person p这样的查询语句,其返回的结果对象不是实体对象),则不存在N+1查询的问题

l        Query.scroll()方法,返回ScrollableResults,利用数据库游标的支持进行查询

l        条件查询:如果利用Example对象,构建查询条件更加方便

l        连接查询

n        内连接查询

u      显式内连接查询:在查询语句中使用join关键字

u      隐式内连接查询:在查询语句中不使用join关键字,而是使用对象导航的方式进行查询

n        外连接查询

u      左外连接查询:除了把满足连接条件的数据查询出来之外,还会把左表的所有数据都查询出来

u      右外连接查询:除了把满足连接条件的数据查询出来之外,还会把右表的所有数据都查询出来

 

缓存策略

l        一级缓存

n        一级缓存是Hibernate内置的缓存策略,不可以取消,但可以对它进行管理

n        一级缓存是session级别的缓存,随着session的关闭而消失

n        一级缓存所缓存的数据是实体对象

u      通过get/load方法加载的实体对象必定会被放到一级缓存中

u      通过HQL语句等查询出来的实体对象也会被放到一级缓存中

n        一级缓存中的实体对象实际上就是处于持久化状态的实体对象!

l        一级缓存的管理

n        Save/update/get/load等操作导致对象被加入到一级缓存中

n        Flush操作导致把内存中(即一级缓存中)对象的状态同步到数据库

n        Refresh操作导致把数据库中相应的记录同步到内存中(即一级缓存中)!

n        Evict/clear操作可以把一级缓存中的对象移出一级缓存,从而变为离线对象

l        二级缓存

n        二级缓存需要启用,并指定缓存策略提供商

n        二级缓存由SessionFactory管理,不会随着session的关闭而消失

l        查询缓存

n        查询缓存也需要启用,并指定缓存策略提供商(和二级缓存使用相同的策略提供商)

n        在查询之前,需要调用Query.setCachable(true)来使用二级缓存!

 

抓取策略

l        基本概念

n        什么叫抓取策略?即加载某个实体对象,如何得到其关联对象的策略!

n        什么叫批量抓取?即查询到一批实体对象,想要得到这批对象的关联对象!

l        单端关联(many-to-one)上设置fetch

n        fetch="select",查询抓取,这是缺省值,意思是加载了某个实体对象,想要得到其关联对象的时候,Hibernate会发出第二条查询语句

n        fetch="join",连接抓取,意思是在加载(load或get)某个实体对象的同时,通过left outer join的SQL语句这种方式同时加载其关联对象,在本项目的实例中,表示在加载Person对象的同时,其关联的Group对象(如果有的话)就已经被加载了,所以,在many-to-one上定义的lazy将失效!!!即关联对象不再延迟加载。

l        单端关联(many-to-one)的批量抓取

n        查询到了一批实体对象,想要得到这批对象的单端关联对象的时候,如果这些关联对象尚未被加载,Hibernate会发出第二条查询语句来查询其关联对象,这样,发出的查询语句可能会比较多。我们可以设置batch-size,提高这些关联对象的批量抓取性能,可以在对方的class映射配置上配置batch-size,Hibenate将自动根据这个值,批量抓取关联对象!

l        集合关联上设置fetch

n        fetch="select",查询抓取,这是缺省值,意思是加载了某个实体对象,想要得到其关联对象(存放在一个集合中)的时候,Hibernate会发出第二条查询语句

n        fetch=”join”,连接抓取,意思是在加载(load或get)某个实体对象的同时,通过left outer join的SQL语句这种方式同时加载其关联对象(存放在一个集合中),lazy机制在这种情况下将失效!

l        集合关联的批量抓取

n        查询到了一批实体对象,想要得到这批对象的关联对象(存放在一个集合中)的时候,如果这些关联对象尚未被加载,Hibernate会发出其它查询语句来查询其关联对象,那么Hibernate会发出什么样的查询语句来查询这些关联对象呢?

u      如果在集合上设置fetch=”select”

l        Hibernate将会通过第二条查询语句逐个查询其关联对象

u      如果在集合上设置fetch=”select”和batch-size

l        Hibernate将会通过若干条批量查询语句查询其关联对象

u      如果在集合上设置fetch=”subselect”

l        Hibernate将会通过唯一一条查询语句(这条查询语句包含一条子查询语句)查询这批实体对象的关联对象,这条子查询语句,是根据查询实体对象的查询语句来生成的!

l        【注意:设置了fetch=”join”之后,关联上的懒加载策略将失效

其它

l        Version用于乐观锁定策略

l        适当调整hibernate.jdbc.batch_size和hibernate.jdbc.fetch_size参数,可以极大提高大批量数据处理的性能


分享到:
评论

相关推荐

    ORM的简单介绍及相应ORM工具Hibernate的使用规则

    对象关系映射的概念,及相应Hibernate的使用规范,同时通过实例展示到底什么是对象关系映射。

    hibernate按自己要求输出自己规则的完整SQL

    在企业做项目时如果用了hibernate会有个头疼问题,就是如何让输出sql方便查看,因为出了问题时,要去查错时sql日志会给我们很大帮助,但hibernate通过配p6spy输出很乱,且只能输了到spy.log中,很不好查看,这里是我...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    hibernate源码release-4.1.4.Final版

    hibernate-release-4.1.4.Final源码,是学习和使用hibernate的好资源,领略大师的编码规则,掌握高超的编码技术,值得学习!hibernate开发人员必备资料!

    Hibernate+中文文档

    5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次...

    hibernate3.2中文文档(chm格式)

    5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次...

    HibernateAPI中文版.chm

    5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次...

    hibernate的规则

    hibernate的简单介绍和基础的方法和基本的内容 适合新手学习

    Hibernate 中文 html 帮助文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate中文详细学习文档

    5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次...

    最全Hibernate 参考文档

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 ...

    Hibernate Criteria用法大全.docx

    一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。 Hibernate Session 接口提供了 createCriteria() 方法,可用于创建一个 Criteria 对象,使当您的应用程序执行一个...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate教程

    Hibernate参考文档 目录 前言 1. 翻译说明 2. 版权声明 1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次...

    注解 Struts2+Spring3+Hibernate3框架整合AJAX+JQuery实现登录、注册以及验证码和验证注册用户信息

    代码简单易懂且肯定正确,有丰富的注释肯定能看明白,本来不想设资源分,但是看到凡是上传代码的都设了资源分,不想破坏规则,2分应该很低了,希望对初学者有帮助,我也是在不断摸索中前进,也希望可以在CSDN这个...

    spring+struts+hibernate工作原理

    三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与数据库交互。典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据...

    Hibernate3.0的规则应用分析

    一、前言 Hibernate和Spring是两个著名的开源框架,越来越广泛地应用于J2EE应用程序的开发中。虽然它们各自所针对的目标不同,但是它们都有一个共同的特点:依赖性映射。Spring注重于在把对象返回到客户之前,帮助...

    bbs论坛系统(structs2+hibernate+jsp)

    该系统是基于Struts2+Hibernate开发的一个论坛系统,其中,Hibernate主要负责数据底层封装处理,Struts2在Action中调用DAO相应的方法实现业务处理。系统采用B/S模式,用java语言结合mysql数据库技术进行开发。系统...

    Hibernate3的帮助文档

    字段和规则元素(column and formula elements) 6.1.20. 引用(import) 6.1.21. any 6.2. Hibernate 的类型 6.2.1. 实体(Entities)和值(values) 6.2.2. 基本值类型 6.2.3. 自定义值类型 6.3. SQL中引号包围的...

Global site tag (gtag.js) - Google Analytics