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

Hibernate文档笔记

阅读更多

 

一、对象定义

1.org.hibernate.SessionFactory

对于单个数据库,被编译的映射,是一个线程安全的缓冲区。是一个Session和ConnectionProvider客户端的工厂。拥有可选的对过程级和集群级重复利用的数据的缓存(二级缓存)。

2.org.hibernate.Session

单线程、短生命周期的在应用程序和持久化存储系统之间的一个会话对象。封装了一个JDBC连接。是一个事务的工厂。拥有强制的对持久化对象的缓存(一级缓存),当通过标识浏览对象之间关系和查找对象时使用。

3.Persistent objects and collections

包含执久化状态和业务功能的短生命周期的、单线程对象。可以是POJOs,通常是和Session(严格说,是单个Session)相关联的对象。Session一关闭,他们将和Session分离,可以自由的使用在应用层的任何地方。(也就是说,作为传输对象使用(Transfer Object)。)

4.Transient and detached objects and collections

不和当前Session关联的持久化类的实例。他们可以被应用程序在不持久化时实例化,也可以被关闭的Session实例化。

5.org.hibernate.Transaction (可选)

应用程序用来指定一个原子操作的单线程、短生命周期的对象。低层JDBC、JTA、CORBA事务的抽象程序。在相似的情况下,一个Session可以同时横跨多个事务。事务划分,既可以使用低层的APIs,也可以使用Transaction。

6.org.hibernate.connection.ConnectionProvider (可选)

JDBC连接或JDBC连接池的工厂。低层DataSource和DriverManager的抽象程序。

这个对象不暴露给应用程序,但是应用程序可以被开发者继承和实现。

7.org.hibernate.TransactionFactory (可选)

Transaction实例的工厂。这个对象不暴露给应用程序,但是应用程序可以被开发者继承和实现。

二、实例状态

持久化对象根据持久化上下文的定义,可以有三种不同的状态。Hibernate Session对象是一个持久化上下文。

1.transient

不关联任何的持久化上下文。没有持久化的标识(指主键值Primary key value)。

2.persistent

和当前持久化上下文关联。他有一个持久化标识,多数情况,在数据库中有对应的行。对于特定的持久化上下文,Hibernate保证持久化标识和Java标识(内存中对象的位置)相同。

3.detached

曾经和一个持久化上下文关联,持久化上下文关闭;或者对象在另一个进程中被序列化。他拥有持久化标识,多数情况,在数据库中有对应的行。对于分离对象Hibernate不保证持久化标识和Java标识的对应关系。

三、JMX集成

JMX是Java组件管理的JEE标准。Hibernate可以被JMX服务管理。在发行版本中,Hibernate提供了一个MBean的实现,org.hibernate.jmx.HibernateService。

在JBoss上,你使用JMX可以得到的好处:

1.Session Management

Hibernate Session的生命周期可以自动的绑定到JTA事务范围。这意味着,你不需要手动的打开关闭Session,这成为JBoss EJB拦截器的要完成的工作。在你的代码中,也不用担心事务的划分,当然除非你想要写一个轻便的持久化层,通过使用Hibernate Transaction APIs。你可以调用HibernateContext来访问Session。

2.HAR deployment

通常使用JBoss Service Deployment Descriptor(在EAR或SAR文件中)发布Hibernate JMX Service,它支持Hibernate SessionFactory所有的常用配置选项。无论如何,你还需要在deployment descriptor中描述所有的映射文件。如果你使用可选的HAR Deployment,JBoss将自动检测所有的映射文件在HAR文件中。

四、JCA 支持

Hibernate也可以配置作为一个连接器。该功能是实践型功能。

 

 

五、Contextual Sessions

许多应用程序需要一种和上下文有关联Hibernate session,这样的session是指贯穿于给定环境的上下文中都有效的session。无论如何,贯穿于应用程序应用上下文由什么组成的清晰度不同,不同的上下文针对当前的概念有不同的范围。

使用Hibernate 3.0以前版本的应用程序,趋于使用自已实现的基于ThreadLocal来维护前后关系的session、诸如HibernateUtil的帮助类;或使用基于代理或拦截机制的第三方的框架(Spring或Pico)。

从Hibernate 3.0.1,Hibernate加入了SessionFactory.getCurrentSession()方法。最初,假定使用JTA事务定义了当前session的scope和context。Hibernate团队维护时,给定了成熟的卓越的JTA TransactionManager的实现方式,多数(但不是所有)应用程序应该使JTA transaction management,不论它是否发布到一个JEE容器中。基于这一点,基于用JTA来维护上下文关系中的session应该是必须的。

无论如何,在Hibernate 3.1,SessionFactory.getCurrentSession()之后的处理,是可以被插拔的,也就是说可以session的范围和上下文。新扩展接口(org.hibernate.context.CurrentSessionContext)和新的配置参数(hibernate.current_session_context_class)被加入,允许插拔,也就是说可以定义session的范围和上下文。

细节可以查看org.hibernate.context.CurrentSessionContext的文档。它定义了一个currentSession()方法,负责跟踪与当前上下文相关联的session。Hibernate提供了这个接口的三种实现方式。

1.org.hibernate.context.JTASessionContext

当前session,通过JTA事务跟踪和标识生命周期。这里的处理过程在处理方法上和老JTA是相似的。

2.org.hibernate.context.ThreadLocalSessionContext

当前session,通过当前执行的线程来跟踪。

3.org.hibernate.context.ManagedSessionContext

当前session,通过当前执行的线程来跟踪。你是负责绑定和解除当前session到执行线程通过使用这个类的静态方法。该类不会open、flush、close session。

前两个实现类,提供了“一个session对应一个数据库事务”的编程模式,也就是众所周知的“session-per-request”模式。Hibernate session的开始和结束,是以数据库中事务的执行时间为依据的。如果你使用编程方式划分事务,用简单的JSE需不是JTA,你应该考虑使用Hibernate事务APIs来隐藏低层的事务代码。如果你使用的是JTA,使用JTA的接口来划分事务。如果你在一个支持CMT(Container Management Transaction)的容器运行程序,事务是通过声明定义,在你程序中不需要任何的代码来划分事务。

Hibernate.current_session_context_class参数应该指定,一个org.hibernate.context.CurrentSessionContext的实现类。如果配置参数没有被设置,而是配置了一个org.hibernate.transaction.TransactionManagerLookup被设置,Hibernate将使用org.hibernate.context.JTASessionContext,这里要考虑向后兼容。典型的情况下,这个参数是使用的类的名字。对于Hibernate提供的三个实现类,有对应的三个简短名,“jta”、“thread”、“managed”。

六、Configuration

1.编程配置

一个org.hibernate.cfg.Configuration的实例表示一个应用程序的所有Java类型到数据库类型的映射。org.hibernate.cfg.Configuration是用来建造一个org.hibernate.SessionFactory。被编译的映射是来自所有的XML映射文件。

片断1.

Configuration cfg = new Configuration().addResource(test.hbm.xml); 

片断2.

Configuration cfg = new Configuration().addClass(com.test.class); 

片断3.

Configuration cfg = new Configuration().setProperty(hibernate.dialectorg.hibernate.dialect.DB2Dialect); 

Configuration可以接收的选项:

(1)传递一个java.util.Properties到Configuration.setProperties()。

(2)放一个hibernate.properties文件到类路径的根目录。

(3)设置系统properties,通过java –Dproperty=value。

(4)包含标签指定值在hibernate.cfg.xml文件。

org.hibernate.cfg.Configuration对象是有意作为一个开始时间生成的对象的,一旦SessionFactory被创建,他将被抛弃掉。

七、获取SessionFactory

当org.hibernate.cfg.Configuration解析完所有的映射文件后,应用程序应该获取一个org.hibernate.Session实例的工厂。这个工厂是被应用程序的所有线程共享的。

SessionFactory sessionFactory = cfg.buildSessionFactory(); 

Hibernate允许应用程序实例多个SessionFactory。对于使用多个数据库的应用程序是非常有用的。

八、JDBC Connections(Session是对JDBC连接的封装)

通常,你应该使用org.hibernate.SessionFactory来创建或共享JDBC。如果这采用这种方法,是非常简单的。

Session session = sessionFactory.openSession(); 

当你的操作需要访问数据库时,一个JDBC连接就会从连接池中被获取。

对于这个工作,我们应该给Hibernate提供一些JDBC连接属性。所有的Hibernate属性名和语义学都被定义在org.hibernate.cfg.Environment。我们现在描述对于JDBC连接配置的一些更重要的设置。

1.如果你设置以下属性,Hibernate将获取或共享连接使用java.sql.DriverManager:

hibernate.connection.driver_class  

 

hibernate.connection.url  

 

10 hibernate.connection.username  

11  

12 hibernate.connection.password  

13  

14 hibernate.connection.pool_size 

Hibernate自己拥有的连接池算法是没有发展的。他是为了你的初始接触使用的,而不是为了你的产品使用的,甚至性能测试时使用。为了更好的性能和稳定性考虑,你应该使用第三方的连接池产品。只需要替换hibernate.connection.pool_size属性的设置用相应连接池的设置。这将关闭Hibernate内部的连接池。例如,可以使用C3P0。

C3P0是一个开源的JDBC连接池,被放置在Hibernate发布文件的lib目录下,随Hibernate一块发行。如果你设置hibernate.c3p0.*属性,Hibernate将会使用org.hibernate.connection.C3P0ConnectionProvider为共享连接。如果你想使用proxool作为连接池,你可以通过查阅hibernat.properties或Hibernate站点获取需要设置的属性名设置。

C3P0配置举例,属性文件片断:

15 hibernate.connection.driver_class=  

16  

17 hibernate.connection.url=  

18  

19 hibernate.connection.username=  

20  

21 hibernate.connection.password=  

22  

23 hibernate.c3p0.min_size=  

24  

25 hibernate.c3p0.max_size=  

26  

27 hibernate.c3p0.timeout=  

28  

29 hibernate.c3p0.max_statements=  

30  

31 hibernate.dialect= 

2.对于在应用服务器内运行的程序,多数情况你应该配置Hibernate通过JNDI找到服务器的javax.sql.DataSource来获取连接。你需要设置以下属性。

32 hibernate.connection.datasource  

33  

34 hibernate.jndi.url  (可选)  

35  

36 hibernate.jndi.class  (可选)  

37  

38 hibernate.connection.username  (可选)  

39  

40 hibernate.connection.password  (可选

你可以通过实现org.hibernate.connection.ConnectionProvider来定义自己的获得连接的策略。通过hibernate.connection.provider_class配置使用自己的定义起作用。

 

九、可选配置项

下面介绍的Hibernate属性,有一些是系统级别的。系统级别的属性只能通过-Dproperty=value来设置或在hibernate.properties文件中设置,不能使用上面的方式设置。

1.Hibernate配置项

(1)hibernate.dialect指定方言后,Hibernate可以根据低层数据库自动产生优化过的SQL。取值为org.hibenate.dialect.Dialect的继承类。多数情况下,Hibernate可以根据低层JDBC返回的metadata来判断。

(2)hibernate.show_sql打印所有的SQL语句到控制台,可以通过设置org.hibernate.SQL类的日志策略到DEBUG级,实现同样的效果。取值true|false。

(3)hibernate.format_sql 格式化SQL语句在打印到控制台或写入日志文件时。取值true|false。

(4)hibernate.default_schema 在产生SQL语句时,在表名前加上映射文件给出的表空间(tablespace)或数据库模式(schema)。取值SCHEMA_NAME。

(5)hibernate.default_catalog 在产生SQL语句时,在表名前加上映射文件给出的catalog。取值CATALOG_NAME。

(6)hibernate.session_factory_name  Hibernate创建org.hibernate.SessionFactory实例后后会自动的将这个绑定到JNDI中的名字上。取值jndi/sf。

(7)hibernate.max_fetch_depth 设置对单个表的外连接数最大深度。0是屏蔽默认的外连接设置。推荐设置为0到3之间。

(8)hibernate.default_batch_fetch_size 设置Hibernate批量联合查询的尺度。强烈建议。推荐设置为4、8、16。

(9)hibernate.default_entity_mode 默认的实体表现模式,通过SessionFactory打开的所有的Session。取值,dynamic-map、dom4j、pojo。

(10)hibernate.order_updates 强迫Hibernate通过被更新项的主键值排序SQL更新。这样可以在高并发时,减少事务死锁。取值true|false。

(11)hibernate.generate_statistics 如果设置为true,Hibernate将为性能调整,收集统计信息。取值true|false。

(12)hibernate.use_identifier_rollback 如果设置为true,产生的标识属性将被重置成默认值,当对象被删除后。取值为true|false。

(13)hibernate.use_sql_comments  如果设置为true,Hiberante将为SQL产生注释,这样更利于调试。默认值为false。取值为true|false。

2.Hibernate JDBC和连接的属性

(1)hibernate.jdbc.fetch_size 指定JDBC的查询尺度。通过调用(Statement.setFetchSize())。

(2)hibernate.jdbc.batch_size 指定Hibernate如何使用JDBC2批量更新。取值,推荐5到30。

(3)hibernate.jdbc.batch_versioned_data 设置这个属性为true,JDBC将返回executeBatch执行后正确的行数。打开这个参数,通常是安全的。Hibernate将自动的译码这些数据使用批量DML。默认为false。取值true|false。

(4)hibernate.jdbc.factory_class 选择一个定制的org.hibernate.jdbc.Batcher。所有的应用程序不需要配置这个属性。取值,定义工厂的类名。

(5)hibernate.jdbc.use_scrollable_resultset  Hibernate使用JDBC2的可滚动记录集。当使用用户提供的JDBC连接时,需要设置这个参数。否则,Hibernate使用连接MetaData。取值true|false。

(6)hibernate.jdbc.use_streams_for_binary 当读或写二进制数据或序列化数据从JDBC或到JDBC,使用流。系统级的数据。设置true|false。

(7)hibernate.jdbc.use_get_generated_keys 在插入后,可以使用JDBC3的PreparedStatement.getGeneratedKeys()中的值找回本地产生的键值。要求JDBC3+和JRE1.4+,如果使用Hibernate identifier generator后你的驱动程序有问题,请设置为false。默认情况下,设法连接MetaData来决定。取值,true|false。

(8)hibernate.connection.provider_class 实现了org.hibernate.connection.ConnectionProvider 接口的类的名称,为Hibernate提供连接。

(9)hibernate.connection.isolation 设置JDBC事务隔离的级别。检查java.sql.Connection的定义的常量值,但要注意大多数数据库不支持所有的隔离级别、一些附加的和非标准的隔离级别。取值,1、2、4、8。

(10)hibernate.connection.autocommit  JDBC共享连接的自动提交。(不推荐)取值,true|false。

(11)hibernate.connection.release_mode 指定什么时候,Hibernate应该释放JDBC连接。默认情况下,JDBC是一直存在,只到Session是被明确关闭或断开连接时。对于应用的服务器JTA数据源,你应该使用after_statement强制释放JDBC连接在每个JDBC请求结束后。对于非JTA数据源,通常是在每个事务结束后释放JDBC连接是有意义的。将该值设为auto时,JTA和CMT事务策略时,是选择after_statement方式。JDBC事务策略时,是选择after_transaction。取值,auto(default),on_close,after_statment,after_transaction。

注意:这个设置只影响通过SessionFactory.openSession打开的session。对于通过SessionFactory.getCurrentSession获取的session,CurrentSessionContext实现类的配置是用来控制这些session的连接释放模式。

(12)hibernate.connection. 传递这些属性到DriverManager.getConnection中。

(13)hibernate.jndi. 传递这些属性到JNDI InitialContextFactory。

3.Hibernate Cache 属性

(1)hibernate.cache.provider_class 定制的CacheProvider的类名。

(2)hibernate.cache.use_minimal_puts 花费更多的读操作,来优化二级缓存的最少写操作。这个操作对于集群缓存是非常有用的。在Hibernate3中,对于集群缓存是默认开启该功能的。取值,true|false。

(3)hibernate.cache.use_query_cache 开启查询缓存,个别查询肯定应该开启查询缓存。取值,true|false。

(4)hibernate.cache.use_second_level_cache 也许过去习惯于完全屏蔽掉二级缓存,默认是开启,对于指定CacheProvider实现类的情况。取值,true|false。

(5)hibernate.cache.query_cache_factory  实现QueryCache接口的类名,默认是内置的StandardQueryCache。

(6)hibernate.cache.region_prefix 对于使用二级缓存区域名的前缀。

(7)hibernate.cache.use_structured_entries 强迫Hibernate在存储数据到二级缓存时,使用更人性化的格式。取值,true|false。

4.Hibernate事务属性

(1)hibernate.transaction.transaction_class  使用Hibernate事务APIs的TransactionFactory的类名。默认是JDBCTransactionFactory。

(2)jta.UserTransaction  JTATransactionFactory使用JNDI名字从应用服务器中获取JTA UserTransaction。取值,jndi/ut。

(3)hibernate.transaction.manager_lookup_class 是一个TransactionManagerLookup实现类的类名。当JVM级别的缓存开启时或在JTA环境中使用hilo generator时,要求指定该值。

(4)hibernate.transaction.flush_before_completion 如果设为true,session将在事务完成阶段之前,自动将缓存区的值推入到数据库中。内置和自动session上下文管理是被优先选用的。取值,true|false。

(5)hibernate.transaction.auto_close_session 如果设为true,session将在事务完成之后,自动的关闭session。内置和自动session上下文管理是被优先选用的。取值,true|false。

5.Miscellaneous properties 各种混合的属性

(1)hibernate.current_session_context_class 提供一个对于当前session生命周期的策略。取值,jta、thread、managed、定制类名。

(2)hibernate.query.factory_class 选择HSQL的解析实现类。取值,org.hibernate.hsql.ast.ASTQueryTranslatorFactory和org.hibernate.hsql.classic.ClassicQueryTranslatorFactory。

(3)hibernate.query.subsitutions Hibernate中标记符到SQL中标记符的映射。举例说,可以是函数名或普通字符串名。取值,如hsqLiteral=SQL_LITERAL,hqlFunction=SQLFUN。

(4)hibernate.hbm2ddl.auto 当SessionFactory被创建时,自动的验证或输出模式DDL(也就建表语句)到数据库中。也就是说,自动的验证数据库表结构或先删除再重新建立,或在原表结构上更新数据表结构。当将值置为create-drop时,在SessionFactory被清除时,将删除数据库中表结构。取值,validate、create、update、create-drop。

(5)hibernate.cglib.use_reflection_optimizer 用CGLIB代替运行期的reflection(系统级属性)。在有故障时,反射是非常有用的,注意Hibernate总是需要CGLIB,甚至在你关闭优化后。你不可以设置这个属性在hibernate.cfg.xml文件中。

 

分享到:
评论
1 楼 跳跃的心灵 2009-12-04  
比较详细的哦!

相关推荐

    强人Hibernate文档笔记

    【强人Hibernate文档笔记】是针对Hibernate框架的深入学习资料,涵盖了对象定义、实例状态、JMX集成和JCA支持等关键概念。以下是对这些内容的详细解释: **一、对象定义** 1. **SessionFactory**: SessionFactory是...

    hibernate学习笔记文档

    ### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...

    hibernate API帮助文档 及hibernate学习笔记

    这篇文档和学习笔记将深入介绍Hibernate的核心概念、API用法以及最佳实践。 1. **Hibernate核心概念** - **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它允许开发者使用面向对象的方式来操作数据库,而...

    Hibernate学习笔记特别详细

    - <hibernate-mapping>:定义映射文档的根元素。 - <class>:定义一个Java类到数据库表的映射。 - <id>:标识一个实体的唯一标识,对应数据库表的主键。 - <property>:映射类中的属性到数据库的列。 007---...

    Hibernate学习笔记源码及文档

    **Hibernate学习笔记源码及文档** Hibernate 是一款强大的Java持久化框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是数据库交互。本资源包含了Hibernate的学习笔记、源码分析以及开发流程说明文档...

    马士兵java框架hibernate学习笔记

    ### 马士兵Java框架Hibernate学习笔记 #### 一、HelloWorld - **知识点概述**: - **项目搭建**:介绍了如何从零开始搭建一个简单的Hibernate项目。 - **环境配置**:包括了如何配置MySQL数据库、创建必要的表...

    Hibernate映射笔记

    ### Hibernate映射笔记详解 #### Hibernate映射文件与配置关系 Hibernate映射是ORM(对象关系映射)框架中的一项关键技术,它允许开发者在数据库表和Java对象之间建立映射关系,从而简化了数据访问层的开发工作。...

    hibernate笔记.txt

    9. **社区和生态**:Hibernate拥有庞大的用户群和活跃的开发者社区,提供了丰富的文档、教程和示例代码,以及各种第三方插件和工具,极大地降低了学习和使用的门槛。 综上所述,《hibernate笔记.txt》虽然部分信息...

    Hibernate笔记 马士兵

    第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 第6课 第一个示例Hibernate HelloWorld 7 第7课 建立Annotation版本的HellWorld 9 第8课 什么是O/R Mapping 11 一、 定义: 11 二、 Hibernate...

    尚学堂hibernate学习笔记(原版整理)

    【尚学堂Hibernate学习笔记】是一份详尽的学习资料,旨在帮助初学者理解并掌握Hibernate这一流行的Java对象关系映射(ORM)框架。该笔记由作者根据马士兵老师的教程整理而成,其中包含了个人的学习注解,使得内容...

    Java EE 相关资料(Struts中文手册、Struts API、Hibernate 学习笔记、Hibernate API文档)

    "Hibernate学习笔记.rar"可能包含关于Hibernate的基本概念、配置、实体类的创建、映射文件的编写、CRUD操作、查询语言HQL和Criteria API的使用等内容,这些都是理解和掌握Hibernate的关键。 "Hibernate3.2官方中文...

    Hibernate笔记完整版

    《Hibernate笔记完整版》 在Web开发领域,Hibernate作为三大框架之一,扮演着至关重要的角色。本文将全面介绍Hibernate,包括其数据持久化的概念、优缺点对比,以及Hibernate的核心概念和编程步骤。 对象持久化是...

    马士兵hibernate学习笔记.docx

    《马士兵Hibernate学习笔记》是一份详尽的教程,涵盖了Hibernate框架的核心概念和技术要点。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,它有效地解决了Java应用程序与数据库之间的数据交互问题,...

    马士兵hibernate学习笔记

    ### 马士兵Hibernate学习笔记知识点总结 #### 一、HelloWorld示例 - **目的**:通过简单的示例理解Hibernate的基本使用流程。 - **步骤**: - 创建Java项目`hibernate_0100_HelloWorld`。 - 建立库依赖,包括...

    Hibernate笔记

    ### Hibernate笔记 #### 一、概述 Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程。通过使用Hibernate,开发者可以将对象模型与关系型数据库模型进行映射,从而避免...

    Hibernate学习笔记

    Hibernate学习笔记 该文档为Hibernate入门到精通的学习笔记

    hibernate培训笔记.pdf

    《Hibernate培训笔记》 Hibernate,一个著名的Java ORM(对象关系映射)框架,自2001年发布以来,已经成为Java开发中持久层设计的重要工具。它的出现旨在解决JDBC和实体Bean在处理对象与关系数据时的局限性,提供更...

Global site tag (gtag.js) - Google Analytics