`

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的dtd 包含hibernate.properties

    Hibernate是Java领域中一款广泛应用的关系...通过正确配置`hibernate.properties`,遵循`hibernate-configuration-3.0.dtd`和`hibernate-mapping-3.0.dtd`的规则,开发者可以实现Java对象与数据库表之间的无缝交互。

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    而`hibernate-configuration-3.0.dtd`和`hibernate-mapping-3.0.dtd`是Hibernate 3.0版本中的两个核心文件,它们定义了Hibernate配置文件和映射文件的语法规则,是理解Hibernate工作原理的关键所在。 首先,我们来...

    hibernate-extensions和Middlegen-Hibernate

    Middlegen-Hibernate的强大之处在于其灵活性,可以通过配置文件定制生成的代码风格和命名规则。 使用hibernate-extensions和Middlegen-Hibernate,开发者可以快速搭建起基于Hibernate的项目,大大缩短项目的启动...

    Hibernate入门jar包

    - `hibernate-validator.jar`:实现了JSR-303/JSR-349 Bean Validation标准,用于验证对象属性的值,确保输入的数据符合预设规则。 - `cglib-nodep.jar`和`asm.jar`:这两个库通常用于动态代理和字节码操作,...

    hibernate必要的jar包

    它允许你在模型类中定义约束规则,进行数据验证,防止无效数据进入数据库,提高数据质量。 4. **dom4j.jar**:这是一个用于处理XML文档的库,Hibernate使用它来读取和写入映射文件(.hbm.xml),这些文件定义了...

    Hibernate学习笔记和资料

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

    Hibernate知识点总结

    - **持久化类**:用于表示数据库中表的Java类,这些类必须遵循一定的规则,例如提供无参数构造函数、提供标识属性等。 - **对象标识OID**:用于唯一标识对象的标识符。在Hibernate中,每个持久化对象都有一个唯一的...

    Hibernate所需架包

    在Java应用开发中,Hibernate通过提供一套规则和API,将数据库操作与业务逻辑解耦,提高了开发效率。"Hibernate所需架包"指的是开发Hibernate应用时需要的依赖库。 这些架包通常包括以下几个关键部分: 1. **...

    hibernate权威整理文档!

    持久化类是普通的Java对象,遵循一定的规则,如提供公共构造器、属性的set/get方法,以及标识主键属性。注意,不应使用final修饰类,因为这将影响Hibernate的动态代理机制。 2. 持久对象标识OID Hibernate通过...

    基于hibernate的简单留言本

    4. **编写业务逻辑层(Service)**: Service层封装了DAO操作,处理业务规则,如验证输入、控制事务等。 5. **实现前端接口**: 创建控制器(Controller)或视图(View),处理用户的请求,调用Service层方法,并将...

    hibernate中文参考文档

    4. 持久化类:介绍如何设计符合Hibernate映射规则的Java类,使得这些类的实例能够被映射到数据库表中。 5. O/R Mapping基础:对象/关系映射是ORM框架的核心功能,这部分内容将介绍对象与数据库表之间的映射原理和...

    hibernate 重点知识原创

    `.hbm.xml` 文件是 Hibernate 的对象-关系映射文件,它定义了实体类和数据库表之间的详细映射规则,包括字段类型、长度、主键生成策略等。例如: ```xml <hibernate-mapping package="com.example"> ...

    hibernate校验 jar包

    《Hibernate校验详解》 Hibernate,作为Java领域中的一款强大持久化框架,为开发者提供了便捷的数据访问和管理功能。在Hibernate的生态系统中,"Hibernate校验"是一个不可或缺的组件,它实现了JSR-303(Java Bean ...

    hibernate的所有包

    5. **hibernate-validator**: Hibernate的验证框架,实现了JSR-303/JSR-349标准,用于对Java Bean属性进行验证,提供了丰富的校验注解和自定义校验规则。 6. **hibernate-commons-annotations**: 提供了一些通用的...

    Hibernate4.1.11中文手册

    注解说明详细解释了@Entity、@Table、@Column、@Id、@GeneratedValue等核心注解的用法,以及如何利用它们来定义实体类和映射规则。 通过《Hibernate4.1.11中文手册》,开发者不仅可以深入理解Hibernate的工作原理,...

    Hibernate5.2.8提取包

    - 注意事务的隔离级别和回滚规则,确保数据一致性。 - 避免在循环中进行大量的数据库操作,尽量批量处理。 7. **学习资源** - 官方文档:提供详细的API参考和教程。 - 示例代码:通过实际的项目或样例代码来...

    解决Hibernate中MySQL的中文排序

    这通常是由于字符集设置、数据库排序规则以及Hibernate的配置等因素导致的。本文将深入探讨如何解决这些问题,确保MySQL数据库中的中文数据能按照正确的顺序进行排序。 首先,我们需要了解MySQL字符集的基础知识。...

Global site tag (gtag.js) - Google Analytics