`
cheng5259
  • 浏览: 61793 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

hibernate 函数

阅读更多

hibernate的五个核心类和接口:

 

<1>Configuration 用于解析hibernate.cfg.xml文件和.hbm.xml文件,并创建SessionFactory对象

   Configuration对象用于配置并启动hibernate.hibernate应用通过Configuration实例来指定对象-关系映射文

   件的位置或者动态配置hibernate的属性,然后创建sessionfactory实例

<2>SessionFactory 初始化hibernate,充当数据存储源的代理,创建Session对象,一个SessionFactory实例对应

   一个数据存储源(数据库),应用从SessionFactory中获得Session实例。如果应用访问多个DB,需要为每个数据

   库创建一个单独的SessionFactory实例

<3>Session 也被称为持久化管理器,对象级数据库操作

   特点:

    1.不是线程安全的,因为在设计软件架构时,应该避免多个线程共享同一个Session实例(及时关闭)

    2.Session实例是轻量级的,所谓轻量级,是指它创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常

     创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单位分配分配单独的

     Session实例。

    3.通常将每一个Session实例和一个DB事务绑定,也就是说,每执行一个DB事务,都应该先创建一个新的

     Session实例,不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占用

     的资源。

<4>Query 执行数据库查询操作 使用HQL (HibernateQueryLanguage)查询语句,HQL查询语句是面向对象的,它

  引用类名及类的属性名。

<5>Transaction 管理操作事务,它对底层的事务接口做了封装,底层事务接口包括:JDBC API、JTA

      (java transaction API)、CORBA(Common Object Request Broker Architecture)API

 

 

 

1、Configuration/SessionFactory/Session
Configuration实例代表了一个应用程序中Java类型 到SQL数据库映射的完整集合. Configuration被用来构建一个(不可变的 (immutable))SessionFactory.
SessionFactory是线程安全的,创建代价很高。
Session是非线程安全的,轻量级的。一个Session对应一个JDBC连接,
Session的connection()会获取Session与之对应的数据库连接Connection对象。
Session的功能就是操作对象的,这些对象和数据库表有映射关系。
Session操作的对象是有状态的,分三类:
自由状态(transient): 未持久化,未与任何Session相关联,数据库表中没有对应的记录。
持久化状态(persistent): 与一个Session相关联,对应数据库表中一条记录。
游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联,数据库表中曾经有一条记录,现在还有没有就不知道了。
游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。通过get()或load()方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。

 


2、Session的save()/persist()/update()/saveOrUpdate()/merge()/delete()方法
save()方法将指定对象保存,插入表中一条数据;
persist()方法将指定对象保存,插入表中一条数据,我还没发现它和save方法有什么特别之处。
replicate()方法完全使用给定对象各个属性的值(包括标识id)来持久化给定的游离状态(Transient)的实体,很暴力啊,其中还需要指定存储模式(有四种保存策略供选择)。
update()方法将指定对象更新,更新表中一条数据;
saveOrUpdate()方法接收一个实体对象,根据实体对象的id判断是否已经存在进行保存或更新操作,这样保存和更新方法就统一了;
merge()方法将给定的对象的状态复制到具有相同标识的持久化对象上。
delete()方法将指定对象删除,删除表中一条数据;
特别注意:为了使用saveOrUpdate()方法,在由定义映射文件时,通过设定<id>标签的unsaved-value="null"来判断执行什么操作: 当id属性等于unsaved-value的值(在此为null)时,则认为还没有保存,应该执行保存操作,否则执行更新操作。这样设定之后,可以使用saveOrUpdate()方法来统一保存和更新的方法。
<id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
<generator class="native"/>
</id>
unsaved-value可以设定的值有四个:
any:总是储存
none:总是更新
null:id为null时储存(预设)
valid:id为null或是指定值时储存

 


3、Session的get()/load()方法
get()方法会总是查询实体对象,不存在时候返回null;
load()方法也是获取一个实体对象,不存在时候抛空指针异常。

 


4、Session的clear()/evict()方法
clear()方法清除Session级别缓存中的所有实体(包括各种状态)对象,目的是释放内存。
evict()方法清除Session级别缓存中的指定的实体(包括各种状态)对象。
当然,Session关闭后,这些缓存也就不存在了,会等待JVM回收。

 


5、Session的flush()方法
flush()强制持久化Session缓存中的实体对象。一般还会调用clear()或evict(),目的是赶紧保存,释放宝贵内存资源。

 


6、Session的commit()/rollback()方法
commit()方法用于提交Session上的事务,否则工作单元不会对数据库产生影响。如果执行出现异常(也就是commit()失败了),则之前的操作取消,执行rollback()可撤消之前的操作。

 


7、Session的close()/isOpen()/isConnected()/reconnect()方法
close()方法关闭Session所对应数据库连接,与其相关联的对象生命周期结束。
isOpen()方法检查Session是否仍然打开,如果Session已经断开,则可以使用reconnect(Connection connection)来重新让Session关联一个JDBC连接。
isConnected()方法检查当前Session是否处于连接状态。

 


8、Criteria、DetchedCriteria和Query接口
Criteria和Query的实例都是和Session绑定的,其生命周期跟随着Session结束而结束。
DetchedCriteria实例相当于一个SQL模板,目的是为了复用。其中的getExecutableCriteria(session)方法接收一个Session对象,并与之绑定,返回一个Criteria对象。

 


9、Hibernate类的initialize()方法
initialize()方法强制Hibernate立即加载指定实体所关联的对象和集合。Hibernate类中还有其他几个很有用但不适很常用的方法。

 


10、映射文件中的lazy属性
在Hibernate3中,class元素的lazy属性默认是true,如果不需要,则需要显示指定为lazy="false",否则,操作load返回的对象会抛异常。另外Hibernate3中还可以为实体属性指定lazy属性。

 


11、JDBC事务和JTA事务
Hibernate本身没有事务管理功能,它依赖于JDBC或JTA的事务管理功能,在Hibernate配置文件中,如果不显式指定Transaction的工厂类别属性hibernate.transaction.factory_class的配置,则默认为JDBC事务:
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>。
在通过SessionFactory获取到Session后,与Session相关联的JDBC Connection实例就被设定为false。
特别注意:如果数据库不支持事务,比如MySQL的MyISAM引擎的表就不支持事务,声明事务也不会起作用。要使MySQL5的表支持事务,则可以指定表的引擎类型为InnoDB。如果是学习或者研究,目前最好还是使用PostgreSQL 8.3或DB2、Oracle。
JDBC事务总是和一个数据库连接(或一个Session)相关联的。
JTA事务则可以跨越多个数据连接(或多个Session),这些连接还可以是不同数据库的连接,JTA事务一般由容器进行管理。编程只要在多个操作单元的开始和结束定义JTA事务的边界即可。
特别注意:如果使用了JTA事务,则不能再用在JDBC式的事务来管理每个Session的操作,否则会出错。为了程序的的通用性,一般来说,都是使用JTA事务来构建应用,这使用任何环境。当然,也可以使用事务代理为每个JDBC的操作方法加入事务控制。这样也为程序以后移植到JTA容器事务上带来很大方便。其实现在可以使用Spring的事务管理,与Hibernate结合的非常完美。

 

PS:persist()方法无返回值,save()方法返回对象标识符。
persist()方法只能保存暂态和持久态的对象,save()方法能保存任何状态对象。
共同点:调用完方法后,对象的状态都变成持久态。
get()方法返回对象的实例,而对于load()方法,如果在持久化上下文存在该标识符的对象,就返回该对象的实例,否则返回对象的代理,该代理对象只含有对象标识符。
使用get或load要小心
load可以提高缓存使用效率 但由于是代理 所以在后面操作会更容易出现问题
get是直接访问db 所以cache的作用就没了 但会马上得到结果 麻烦少,但频繁调用势必对服务器压力增加

 


出处参考:http://www.jb51.net/article/16476.htm(脚本之家)

分享到:
评论

相关推荐

    Hibernate 函数 ,子查询 和原生SQL查询

    **Hibernate函数** Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。在Hibernate中,你可以使用内置的函数来处理数据,这些函数包括但不限于: 1. **Hibernate...

    jsp Hibernate 函数简介.docx

    在Java Web开发中,Hibernate是一个流行的ORM...综上所述,理解和熟练使用这些Hibernate函数对于在JSP中高效地操作数据库至关重要。通过合理运用,开发者可以减少与数据库的交互次数,提高应用性能,并降低代码复杂性。

    jsp Hibernate 函数简介

    ### jsp Hibernate 函数简介及使用技巧 #### 一、Configuration/SessionFactory/Session 的概念及其作用 - **Configuration**:在Hibernate中,`Configuration` 类是配置Hibernate的基础,它负责加载配置文件(如 ...

    hibernate 调用oracle函数

    4. **定义Hibernate Native SQL查询**:由于Hibernate默认不支持调用存储过程或函数,我们需要使用`@NamedNativeQuery`或`@SqlResultSetMapping`注解来定义一个原生SQL查询,用于调用Oracle函数。例如: ```java @...

    java-hibernate调用mysql过程和函数的方式知识.pdf

    Java-Hibernate 调用 MySQL 过程和函数的方式知识 Java-Hibernate 框架中调用 MySQL 数据库中的过程和函数是通过 CallableStatement 对象来实现的。下面将详细介绍如何调用 MySQL 中的过程和函数。 调用函数 在 ...

    Hibernate_query聚合函数查询.

    本篇主要探讨的是Hibernate对数据库查询中聚合函数的应用,这些功能使我们能够高效地处理数据统计和汇总任务。在学习过程中,我们经常会遇到诸如求和(SUM)、平均值(AVG)、最大值(MAX)、最小值(MIN)以及计数...

    LM3S例程系列之--Hibernate

    3. **调用Hibernate函数**:在LM3S系列微控制器中,会有一个专门的函数或API用于进入Hibernate模式,如`HibernateEnter()`。调用这个函数后,系统会立即停止执行,并进入休眠状态。 4. **恢复现场**:当系统被唤醒...

    详解Hibernate呼叫Oracle的存贮过程和函数

    本示例演示Hibernate 3.2呼叫Oracle的存贮过程和函数,以及通过Hibernate的Query接口简化JDBC的开发步骤--两个步骤得到List集合。使用这种方式开发可以要求开发人员不需要太了解Hibernate框架,但是需要开发人员非常...

    达梦Hibernate方言2.0至4.0

    例如,达梦Hibernate方言会包含对达梦特有的数据类型、函数和存储过程的适配。 对于“达梦Hibernate方言2.0至4.0”,这意味着该方言支持Hibernate框架从2.0到4.0的多个版本。每个新版本的Hibernate都可能引入新的...

    Hibernate3.6

    5. **Query 改进**:HQL 和 Criteria 查询支持更多的函数和操作符,如日期、时间函数、集合操作等,使得查询表达力更加强大。 6. **性能优化**:3.6 版本对缓存机制进行了优化,支持更高效的二级缓存策略,同时优化...

    hibernate所需包:hibernate3,依赖包,JDBC

    3. **CGLIB或ASM**: 用于为那些没有默认构造函数或者不可被代理的类生成动态代理,用于Hibernate的懒加载功能。 4. **DOM4J或JAXB**: 处理XML配置文件,如映射文件。 **JDBC** Java Database Connectivity (JDBC)...

    Hibernate底层数据库操作函数BaseDao+具体实例

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是数据库层面的细节。`BaseDao`是常见的一种设计模式,用于封装Hibernate的基本数据库...

    Hibernate 简单 PPT 总结

    - "04-2018-7-8-Hibernate-functiongtest.pptx"可能是关于函数测试和Hibernate的结合,讲解如何使用Hibernate进行功能测试。 - "2018-7-26-Hibernate-加载策略.pptx"可能涉及了Hibernate的对象状态管理,包括延迟...

    Hibernate知识点总结

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

    Hibernate源码

    Hibernate-spatial扩展了Hibernate,支持地理空间数据类型和函数。它可以与流行的GIS库(如JTS)集成,提供地理空间查询和操作,对于地理信息系统和位置感知应用非常有用。 在深入研究Hibernate源码时,可以关注...

    NHibernate hql 可用函数,函数大全

    ### NHibernate HQL 可用函数详解 #### 一、查询基本语法与示例 **1. 基本查询** - **语法**: `FROM &lt;类名&gt; [WHERE &lt;条件&gt;]` - **示例**: `FROM Category c WHERE c.name &gt; 'c5'` **2. 排序查询** - **语法**: `...

    hibernate-core 核心jar包

    HQL支持复杂的查询,包括联接、子查询、聚合函数等,可以避免直接写SQL,提高代码的可读性和可维护性。 6. ** Criteria 查询**:另一种面向对象的查询方式,提供了一种动态构建查询的方式。相比HQL,Criteria查询更...

    java-hibernate调用mysql过程和函数的方式.pdf

    当需要调用MySQL中的过程和函数时,Hibernate并不能直接处理,因此我们需要借助JDBC(Java Database Connectivity)API。以下是Java-Hibernate调用MySQL过程和函数的详细步骤: 1. **调用函数** - 函数调用通常...

Global site tag (gtag.js) - Google Analytics