HIbernate第一课--基本原理,配置

来源:互联网 发布:mac地址表包括vlan吗 编辑:程序博客网 时间:2024/05/28 01:35
http://blog.csdn.net/tanyit/article/details/6987279#_Toc251597268
参考马士兵
一 基本原理
二 配置


(一)基本原理:
Hibernate是一个轻量级的ORMapping框架

1. ORMapping的基本对应规则
a) 类与表
b)类属性与表字段
c)类的实例与表中具体的一条记录相对应
d)一个类可以对应多个表,一个表也可以对应多个类
e)DB中的表可以没有主键,但是Object中必须设置主键字段
f)DB中表与表之间的关系(如 外键)映射成为Object之间的关系
g)Object中属性的个数和名称可以和表中定义的字段和名称不一样


2. Configuration类
数据库URL
数据库用户
数据库用户密码
数据库JDBC驱动类(JNDI区分)
数据库适配器(dialect)针对不同数据库
可以配置在hibernate.cfg.xml或hibernate.properties

调用
Configuration config = new Configuration().configure();
会自动在当前classpath搜寻hibernate.cfg.xml文件加载至内存中,作为后继操作的基础配置

Configuration类一般只有在获取SessionFacotry时需要涉及,当SessionFacotry实例创建之后,由于配置信息已经由Hibernate绑定在返回的SessionFactory之中,因此一般情况下无需再对其进行操作
如果不想使用默认hibernate.cfg.xml文件作为配置文件,我们也可以指定配置文件名:
File file = new File("C:\\sample\\myhibernate.xml");
Configuration config = new Configuration().configure(file);


3. SessionFactory
SessionFacotry负责创建Session实例,可以通过Configuration实例构建SessionFactory:
Configuration config = new Configuration()。configure();
SessionFactory sessionFactory = config.buildSessionFacotry();
SessionFacotry通过config创建实例后,就不会再创建不会改变,如果需要重新获取config中的信息需要重新创建SessionFactory
如果有多个数据库需要针对每一个数据库,分别为创建对应的SessionFacotry实例

因为SessionFactory保存了当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和Statement Pool,由此可见,SessionFactory的创建过程非常复杂,代价高昂,所以系统射击时需要充分考虑SessionFactory重用策略,由于SessionFactory采取线程安全的射击,可由多个线程并发调用,因此一个应用针对一个数据库共享一个SessionFacotry实例即可。

4. Session
org.hibernate.Session,表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了JDBC链接,也是Transaction的工厂

当它产生一个Session时,会从数据库连接池取出一个连接,交给这个Session

Session session = sessionFactory.getCurrentSession();

         并且可以通过这个Session取出这个连接

         关注两个方法:

         getCurrentSession():表示当前环境没有Session时,则创建一个,否则不用创建

         openSession():     表示创建一个Session(3.0以后不常用),使用后需要关闭这个Session

         两方法的区别:

           ①、openSession永远是每次都打开一个新的Session,而getCurrentSession不是,是从上下文找、只有当前没有Session时,才创建一个新的Session

           ②、OpenSession需要手动close,getCurrentSession不需要手动close,事务提交自动close

           ③、getCurrentSession界定事务边界



5. Transaction
org.hibernate.Transaction,应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短,它通过抽象将应用从底层具体的JDBC,JTA以及CORBA事务隔离开

6. ConnectionProvider
org.hibernate.connection.ConnectionProver,生成JDBC连接的工厂(有连接池的作用)它通过抽象将应用从底层的Datasource或Drivermanager隔离开,仅供开发者扩展/实现用,并不暴露给应用程序使用。

7. TransactionFactory
org.hibernate.TransactionFactory,生成Transaction对象实例的工厂,仅供开发者扩展使用,并不暴露给应用程序使用


(二)hibernate.cfg.xml配置

1 配置实体类
a). 在java代码中配置--不推荐
如果不想在hbm.cfg.xml中配置 映射 在应用程序中指定cg.xml里面的配置信息,不推荐
如下:
Configuration cfg = new Configuration()
.addResources("Item.hbm.xml")
.addResource("Bid.hbm.xml");
b). 让Hibernate帮你寻找映射定义文件:
Configuration cfg = new Configuration()
.addClass("org.hibernate.auction.Item.class")
.addClass("org.hibernate.auction.Bid.class");

其他配置方式
d) properties文件
e)xml文件
f)设置Java的系统属性,形如: java -Dproperty=value

注意
org.hibernate.cfg.Configuration实例被射击成启动期间(startup-time)对象,一旦SessionFactory创建完成它就被丢弃


2 数据库连接
1) Hibernate与数据库连接的方式
a)JDBC
属性用途hibernate.connection.drive_classJDBC驱动hibernate.connection.urlJDBC URLhibernate.connection.username数据库用户hibernate.connection.password数据库密码hibernate.connection.pool_size连接池容器上线数目

b)JNTI
属性名用途hibernate.connection.datasource数据源JNTI名字hibernate.jndi.urlJNDI提供者的URL(可选)hibernate.jndi.classJNDI initialContextFactory类(可选)hibernate.connection.username数据库用户(可选)hibernate.connection.password数据库用户密码(可选)


2)数据库连接池配置

Hibernate4和Hibernate3在配置上的一些区别: 连接池c3p0的配置 由于Hibernate自己实现的连接池不太好,在项目中,建议使用工业级的连接池,比如:c3p0,Hibernate发行包中带有c3p0的专用jar包hibernate-c3p0-4.1.4.Final.jar,在以前的Hibernate3.X版本中是直接在核心jar包里面的,在4.X版本之后包名做出来调整,大家使用的时候需要注意了。

a) 默认数据库连接池
hibernate.connection.pool_size = 2

b) C3P0
hibernate.c3p0.mex_size = 2
hibernate.c3p0.min_size = 2
hibernate.c3p0.timeout = 5000
hibernate.c3p0.max_statements = 3000
hibernate.c3p0.acquire_increment = 2
hibernate.c3p0.validate = false
hibernate.c3p0.connection.provider_class = net.sf.hibernate.connection.C3P0ConnectionProvider

c) dbcp
hibernate.dbcp.maxActive = 100
hibernate.dbcp.whenExhaustedAction = 1
hibernate.dbcp.maxWait = 120000
hibernate.dbcp.maxIdle = 10
hibernate.dbcp.ps.maxActive = 100
hibernate.dbcp.ps.whenExhaustedAction = 1
hibernate.dbcp.ps.maxWait = 120000
hibernate.dbcp.ps.maxidle = 10
## optional query to validate pooled connections :
hibernate.dbcp.validationQuery select 1 from dual
hibernate.dbcp.testonBorrow = true
hibernate.dbcp.testOnReturn = false
hibernate.connection.provider_class =
net.sf.hibernate.connection.DBCPConnectionProvider

d) Proxool
##properties for external configuration of proxool
hibernate.proxool.pool_alias pool1
## Only need one of the following
hibernate.proxool.existing_proxool = true
hibernate.proxool.xml = proxool.xml
hibernate.proxool.properties = proxool.properties
hibernate.connection.provider_class =
net.sf.hibernate.connection.ProxoolConectionProvider


4中缓存策略中,C3P0,dbcp以及Proxool需要指定hibernate.connection.provider_class,具体功能大同小异,一般推荐Apache的dbcp

3)Hibernate配置属性 
属性名用途取值hibernate.dialect一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQLfull.classname.of.Dialecthibernate.show_sql输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为debugtrue & falsehibernate.format_sql在log和console中打印出更漂亮的SQLtrue & falsehibernate.default_schema在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上.SCHEMA_NAMEhibernate.default_catalog在生成的SQL中, 将给定的catalog附加于非全限定名的表名上.CATALOG_NAMEhibernate.session_factory_nameSessionFactory创建后,将自动使用这个名字绑定到JNDI中.jndi/composite/namehibernate.max_fetch_depth为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取.建议在0到3之间取值hibernate.default_batch_fetch_size为Hibernate关联的批量抓取设置默认数量.建议的取值为4, 8, 和16hibernate.default_entity_mode为由这个SessionFactory打开的所有Session指定默认的实体表现模式.dynamic-map, dom4j, pojohibernate.order_updates强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。true & falsehibernate.generate_statistics如果开启, Hibernate将收集有助于性能调节的统计数据.true & falsehibernate.use_identifer_rollback如果开启, 在对象被删除时生成的标识属性将被重设为默认值.true & falsehibernate.use_sql_comments如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为false.true & false

4)JDBC和连接(connection)属性 
属性名用途取值hibernate.jdbc.fetch_size非零值,指定JDBC抓取数量的大小 (调用Statement.setFetchSize()).  hibernate.jdbc.batch_size  非零值,允许Hibernate使用JDBC2的批量更新.建议取5到30之间的值hibernate.jdbc.batch_versioned_data如果你想让你的JDBC驱动从executeBatch()返回正确的行计数 , 那么将此属性设为true(开启这个选项通常是安全的). 同时,Hibernate将为自动版本化的数据使用批量DML. 默认值为false.true & falsehibernate.jdbc.factory_class选择一个自定义的Batcher.多数应用程序不需要这个配置属性.classname.of.Batcherhibernate.jdbc.use_scrollable_resultset允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时,这个选项才是必要的, 否则Hibernate会使用连接的元数据.true & falsehibernate.jdbc.use_streams_for_binary在JDBC读写binary (二进制)或serializable (可序列化) 的类型时使用流(stream)(系统级属性).true & falsehibernate.jdbc.use_get_generated_keys在数据插入数据库之后,允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题,请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力.true & falsehibernate.connection.provider_class自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接.classname.of.ConnectionProviderhibernate.connection.isolation设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别.1, 2, 4, 8hibernate.connection.autocommit允许被缓存的JDBC连接开启自动提交(autocommit) (不建议).true & falsehibernate.connection.release_mode指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement, 这样在每次JDBC调用后,都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction.auto (默认) & on_close & after_transaction & after_statement (这些设置仅对通过SessionFactory.openSession得到的Session起作用。对于通过SessionFactory.getCurrentSession得到的Session,所配置的CurrentSessionContext实现控制这些Session的连接释放模式hibernate.connection.<propertyName>将JDBC属性propertyName传递到DriverManager.getConnection()中去. hibernate.jndi.<propertyName>将属性propertyName传递到JNDI InitialContextFactory中去. 


5)Hibernate缓存属性 
属性名用途取值hibernate.cache.provider_class自定义的CacheProvider的类名.classname.of.CacheProviderhibernate.cache.use_minimal_puts以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中,这个设置对的集群缓存非常有用, 对集群缓存的实现而言,默认是开启的.true & falsehibernate.cache.use_query_cache允许查询缓存, 个别查询仍然需要被设置为可缓存的.true & falsehibernate.cache.use_second_level_cache能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<cache>的类,会默认开启二级缓存.true & falsehibernate.cache.query_cache_factory自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache.classname.of.QueryCachehibernate.cache.region_prefix二级缓存区域名的前缀.prefixhibernate.cache.use_structured_entries强制Hibernate以更人性化的格式将数据存入二级缓存.true & false

6)Hibernate事务属性 
属性名用途取值hibernate.transaction.factory_class一个TransactionFactory的类名, 用于Hibernate Transaction API (默认为JDBCTransactionFactory).classname.of.TransactionFactoryjta.UserTransaction一个JNDI名字,被JTATransactionFactory用来从应用服务器获取JTA UserTransaction.jndi/composite/namehibernate.transaction.manager_lookup_class一个TransactionManagerLookup的类名 - 当使用JVM级缓存,或在JTA环境中使用hilo生成器的时候需要该类.classname.of.TransactionManagerLookuphibernate.transaction.flush_before_completion如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理true & falsehibernate.transaction.auto_close_session如果开启, session在事务完成后将被自动关闭true & false
TransactionFactory有三个标准(内建)的选择: 
a)委托给数据库(JDBC)事务(默认) 
Hibernate3:org.hibernate.transaction.JDBCTransactionFactory 
Hibernate4:org.hibernate.engine.transaction.internal.jdbc.JDBCTransactionFactory

b)JTA事务,如果在上下文环境中存在运行着的事务(如, EJB会话Bean的方法), 则委托给容器管 理的事务, 否则,将启动一个新的事务,并使用Bean管理的事务. 
Hibernate3: org.hibernate.transaction.JTATransactionFactory 
Hibernate4: org.hibernate.engine.transaction.internal.jta.JTATransactionFactory 

c)委托给容器管理的JTA事务 
Hibernate3: org.hibernate.transaction.CMTTransactionFactory 
Hibernate4:org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory 
也可以定义属于你自己的事务策略 (如, 针对CORBA的事务服务) 

7)其他属性 
属性名用途取值hibernate.current_session_context_class为"当前" Session指定一个(自定义的)策略jta & thread & managed & custom.Classhibernate.query.factory_class选择HQL解析器的实现.org.hibernate.hql.ast.ASTQueryTranslatorFactory 和org.hibernate.hql.classic.ClassicQueryTranslatorFactoryhibernate.query.substitutions将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字).hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNChibernate.hbm2ddl.auto在SessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema.validate & update & create & create-drophibernate.cglib.use_reflection_optimizer开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性.true & false
8)SQL方言 
RDBMS方言DB2org.hibernate.dialect.DB2DialectDB2 AS/400org.hibernate.dialect.DB2400DialectDB2 OS390org.hibernate.dialect.DB2390DialectPostgreSQLorg.hibernate.dialect.PostgreSQLDialectMySQLorg.hibernate.dialect.MySQLDialectMySQL with InnoDBorg.hibernate.dialect.MySQLInnoDBDialectMySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialectOracle (any version)org.hibernate.dialect.OracleDialectOracle 9i/10gorg.hibernate.dialect.Oracle9DialectSybaseorg.hibernate.dialect.SybaseDialectSybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialectMicrosoft SQL Serverorg.hibernate.dialect.SQLServerDialectSAP DBorg.hibernate.dialect.SAPDBDialectInformixorg.hibernate.dialect.InformixDialectHypersonicSQLorg.hibernate.dialect.HSQLDialectIngresorg.hibernate.dialect.IngresDialectProgressorg.hibernate.dialect.ProgressDialectMckoiSQL org.hibernate.dialect.MckoiDialectInterbaseorg.hibernate.dialect.InterbaseDialectPointbaseorg.hibernate.dialect.PointbaseDialectFrontBaseorg.hibernate.dialect.FrontbaseDialectFirebirdorg.hibernate.dialect.FirebirdDialect


原创粉丝点击