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

参考马士兵
一 基本原理
二 配置


(一)基本原理:
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_class JDBC驱动
hibernate.connection.url JDBC URL
hibernate.connection.username 数据库用户
hibernate.connection.password 数据库密码
hibernate.connection.pool_size 连接池容器上线数目

b)JNTI
属性名 用途
hibernate.connection.datasource 数据源JNTI名字
hibernate.jndi.url JNDI提供者的URL(可选)
hibernate.jndi.class JNDI 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针对特定的关系数据库生成优化的SQL full.classname.of.Dialect
hibernate.show_sql 输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为debug true & false
hibernate.format_sql 在log和console中打印出更漂亮的SQL true & false
hibernate.default_schema 在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. SCHEMA_NAME
hibernate.default_catalog 在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. CATALOG_NAME
hibernate.session_factory_name SessionFactory创建后,将自动使用这个名字绑定到JNDI中. jndi/composite/name
hibernate.max_fetch_depth 为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取. 建议在0到3之间取值
hibernate.default_batch_fetch_size 为Hibernate关联的批量抓取设置默认数量. 建议的取值为4, 8, 和16
hibernate.default_entity_mode 为由这个SessionFactory打开的所有Session指定默认的实体表现模式. dynamic-map, dom4j, pojo
hibernate.order_updates 强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 true & false
hibernate.generate_statistics 如果开启, Hibernate将收集有助于性能调节的统计数据. true & false
hibernate.use_identifer_rollback 如果开启, 在对象被删除时生成的标识属性将被重设为默认值. true & false
hibernate.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 & false
hibernate.jdbc.factory_class 选择一个自定义的Batcher.多数应用程序不需要这个配置属性. classname.of.Batcher
hibernate.jdbc.use_scrollable_resultset 允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时,这个选项才是必要的, 否则Hibernate会使用连接的元数据. true & false
hibernate.jdbc.use_streams_for_binary 在JDBC读写binary (二进制)或serializable (可序列化) 的类型时使用流(stream)(系统级属性). true & false
hibernate.jdbc.use_get_generated_keys 在数据插入数据库之后,允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题,请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. true & false
hibernate.connection.provider_class 自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接. classname.of.ConnectionProvider
hibernate.connection.isolation 设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. 1, 2, 4, 8
hibernate.connection.autocommit 允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). true & false
hibernate.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.CacheProvider
hibernate.cache.use_minimal_puts 以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中,这个设置对的集群缓存非常有用, 对集群缓存的实现而言,默认是开启的. true & false
hibernate.cache.use_query_cache 允许查询缓存, 个别查询仍然需要被设置为可缓存的. true & false
hibernate.cache.use_second_level_cache 能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<cache>的类,会默认开启二级缓存. true & false
hibernate.cache.query_cache_factory 自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache. classname.of.QueryCache
hibernate.cache.region_prefix 二级缓存区域名的前缀. prefix
hibernate.cache.use_structured_entries 强制Hibernate以更人性化的格式将数据存入二级缓存. true & false


6)Hibernate事务属性 
属性名 用途 取值
hibernate.transaction.factory_class 一个TransactionFactory的类名, 用于Hibernate Transaction API (默认为JDBCTransactionFactory). classname.of.TransactionFactory
jta.UserTransaction 一个JNDI名字,被JTATransactionFactory用来从应用服务器获取JTA UserTransaction. jndi/composite/name
hibernate.transaction.manager_lookup_class 一个TransactionManagerLookup的类名 - 当使用JVM级缓存,或在JTA环境中使用hilo生成器的时候需要该类. classname.of.TransactionManagerLookup
hibernate.transaction.flush_before_completion 如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理 true & false
hibernate.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.Class
hibernate.query.factory_class 选择HQL解析器的实现. org.hibernate.hql.ast.ASTQueryTranslatorFactory 和org.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.query.substitutions 将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
hibernate.hbm2ddl.auto 在SessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema. validate & update & create & create-drop
hibernate.cglib.use_reflection_optimizer 开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性. true & false

8)SQL方言 
RDBMS 方言
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值