`

Hibernate核心类

阅读更多


Hibernate核心编程

ORM:指的是对象关系映射(object/Relation Mapping)。

 

Hibernate:指的是对象关系映射的一种框架工具。

 

PO:持久化对象(Persistent Object),作用是完成持久化操作,即以面向对象的方式操作(增删改查)数据库。

 

POJO:(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans.

 

注意:为了使其具有持久化能力,还需创建该它的映射文件xml,如user.xml

 

同时在Hibernate.cfg.xml中添加<mapping resource="user.xml"/>

 

PO有3个状态:瞬时、持久化、脱管。


一、核心类
Session接口:负责持久化对象的CRUD操作
SessionFactory接口:负责初始化Hibernate
Configuration接口:负责配置并启动Hibernate
Transaction接口:负责事务
Query接口和Criteria接口:负责执行各种数据库查询
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成
它就被丢弃了。
二、Session的3个状态
(1)自由状态(瞬时态):不曾持久化,未与任何Session相关联
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系
session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。
(2)持久化对象:仅与一个Session相关联
1. 和session实例关联;
2. 在数据库中有与之关联的记录
hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。
当一个session执行close()或clear()、evict()之后,持久对象变成托管对象,此时持久对象会变成托管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。
(3)游离状态(托管态):已经进行过持久化,但当前未与任何Session相关联
托管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2. 比瞬时对象多了一个数据库记录标识值
三、Session操作
保存对象
save()
装载对象
load()
装载对象
get()
强制提交并刷新
flush()
提交游离状态的对象
update()
移除持久化对象
delete()
强制装载对象
refresh()
四、Query查询
不带参数查询
session.createQuery("from user");
带参数的查询
session.createQuery("from user where userid=:userid");
query.setString("userid","admin");
带集合的查询
session.createQuery("from user where userid in(:userList)");
query.setString("userList",userList);//userList是一个List
取得List结果集
query.list();
取得iterator
query.iterate();
取得一个对象
query.uniqueResult();
标量查询
session.createQuery("select u.username from user u group by u.username");
分页查询
Query query=session.createQuery("from user");
query.setFirstResult(10);//设置起始范围
query.setMaxResult(20);//设置结束范围
List list=query.list();
创建SQL查询
List users=session.createSQLQuery("select {u.*} from User {u}").list();
五、使用Criteria进行条件查询
创建Criteria实例
Criteria criteria=session.createCriteria(User.class);
criteria.setMaxResult(50);
List users=criteria.list();
添加查询条件
Criteria criteria=session.createCriteria(User.class);
criteria.add(Restrictions.like("username","admin%"));
criteria.add(Restrictions.between("ID",1,10));
List users=criteria.list();
或直接用sql
Criteria criteria=session.createCriteria(User.class)
.add(Restrictions.sql("lower({alias}.username) like lower(?)","admin%",Hibernate.STRING));
添加排序条件
Criteria criteria=session.createCriteria(User.class);
.add(Restrictions.like("username","admin%"))
.addOrder(Order.asc("username"))
.addOrder(Order.desc("password"))
.setMaxResult(50)
.list();
构造条件查询
User user=new User();
user.setUsername("admin");
List results=session.createCriteria(User.class).add(Example.create(user)).list();

 

 

六、hibernate主键生成机制
1) assigned
主键由外部程序负责生成,无需Hibernate参与。

2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。

5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。

6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。

7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。

10) foreign
使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。

另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制

 

 

 

 

 

分享到:
评论

相关推荐

    Hibernate的核心接口与类

    Hibernate的核心接口与类

    hibernate核心包

    Hibernate3.jar hibernate核心包 antlr-2.7.6.jar 一个语言转换工具(Hibernate利用它实现 HQL 到 SQL 的转换模板相关操作需要包) c3p0-0.9.1.jar c3p0数据源实现的jar文件 cglib.jar CGLIB 字节码解释器 commons-...

    Hibernate核心类和接口的详细介绍

    今天小编就为大家分享一篇关于Hibernate核心类和接口的详细介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    T21.2_Hibernate核心接口与类 java 经典教程 经典教材

    T21.2_Hibernate核心接口与类 java 经典教程 经典教材

    spring-struts1-strust2-hibernate 核心包介绍

    这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。 (2) spring-beans.jar 这个jar文件是所有应用...

    hibernate工具类大全

    搭建Hibernate需要的东西都在这里,包括jar包,持久化类的配置,核心文件的配置,dtd文件,以及一些hibernate的资料

    Hibernate框架 jar 架包 开发详解

    Hibernate 简介 Hibernate 开发流程 Hibernate 配置文件 Hibernate 核心接口和类 Hibernate ORM映射 HQL Hibernate 懒加载机制与抓取策略 Hibernate 缓存 Hibernate 锁机制

    Hibernate笔记 马士兵

    第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 第6课 第一个示例Hibernate HelloWorld 7 第7课 建立Annotation版本的...第14课 Hibernate核心开发接口(重点) 29 ........

    Hibernate学习笔记和资料

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

    Hibernate5快速学习步骤

    本章学习目标  Hibernate 初认识  Hibernate 的HelloWorld  hibernate.cfg.xml 配置详解  *.hbm.xml 对象映射文件... Hibernate 核心接口详解  抽取HibernateUtil 工具类  使用Session 接口进行增删改查

    Hibernate体系结构的概要图

    在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。 Transaction接口  Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己...

    Hibernate包作用详解

     CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包  dom4j.jar:  dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有...

    最新Hibernate jar 架包(9个)

    hibernate-3.2.0.ga.jar Hibernate的核心包,所以是必须的jar包 cglib-nodep-2.1_3.jar AOP dom4j-1.6.1.jar dom4j是一个Java的XML API,类似于jdom, 用来读写XML文件的,这是必须使用的jar包,Hibernate用它来读写...

    有关jbpm的核心组件

    Jbpm由核心组件,web控制台,调度组件,BPEL扩展组件几大组件组成,核心组件是由纯java编写,所以能很好的和j2se程序,javaee程序结合。JBPM的持久层采用符合jpa标准的hibernate框架,身份组件用于管理用户。

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.2 Hibernate的核心 12.2.1 Configuration(配置Connection) 12.2.2 SessionFactory(Connection工厂) 12.2.3 Session(提供Connection) 12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写...

    struts2+spring+hibernate整合示例

    a 加入支持:添加 spring核心包、hibernate 3.6 包、 spring整合hibernate包 , 在src下建立applicationContext.xml (先建立src下便于测试hibernate)。 b 编写实体类,加入hibernate注解,编写方法类测试类,在...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     2.4.1 Hibernate的核心接口  2.4.2 事件处理接口  2.4.3 Hibernate映射类型接口  2.4.4 可供扩展的接口  2.5 小结  2.6 思考题 第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类...

    hibernate通用查询语句生成类

    这是一个java代码包,里面提供了一个核心类,专门负责生成 hibernate查询语句(常用的,并非所有,现在能力有限),其他都是一些辅助类,自我感觉还可以。主要是为了减轻以后的项目开发负担,可以省去拼接hql查询语句的...

    Struts,Hibernate,Spring集成开发宝典.pdf

    《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成开发实例讲解了这三个组件在J2EE项目中的应用。《Struts Hibernate ...

    hibernate笔记

    6 Hibernate核心开发接口介绍(重点) 5 7 对象的三种状态(了解) 5 8 关系映射(重点) 5 9 Hibernate査询(HQL) 5 10 在Struts基础上继续完善BBS200 5 11 性能优化(重点) 5 12 补充话题 5 风格 5 1 先脉络,后...

Global site tag (gtag.js) - Google Analytics