Hibernate的设计思路
Hibernate是一种全自动化管理持久化对象的ORM框架,既提供了完全面向对象的封装完整的对象持久化接口(屏蔽db层的差异化,提升代码可移植性),也提供了操作HQL和SQL的半自动化DB访问接口(提供复杂查询的扩展性)。
配置hibernate.cfg.xml和***.hbm.xml文件
文件hibernate.cfg.xml是Hibernate的核心配置文件,用于定义Hibernate与DB交互的核心配置,文件**.hbm.xml是定义多个对象与DB table的映射关系和更新规则。
创建一个典型的hibernate.cfg.xml文件配置如下:
1 <hibernate-configuration> 2 <!-- 一个session-factory节点代表一个数据库 --> 3 <session-factory> 4 <!-- 1. 数据库连接配置 --> 5 <property name="hibernate.connection.driver_class"> 6 com.mysql.jdbc.Driver 7 </property> 8 <property name="hibernate.connection.url"> 9 jdbc:mysql://localhost:3306/ychenDemo 10 </property> 11 <property name="hibernate.connection.username">root</property> 12 <property name="hibernate.connection.password">root</property> 13 <!-- 2. 根据不同的db方言生成符合当前db语法的sql--> 14 <property name="hibernate.dialect"> 15 org.hibernate.dialect.MySQL5Dialect 16 </property> 17 <!-- 3. 显示hibernate在运行时候执行的sql语句 --> 18 <property name="hibernate.show_sql">true</property> 19 <!-- 4. 格式化sql --> 20 <property name="hibernate.format_sql">true</property> 21 <!-- 5. 如果没有表则创建,如果有则更新 --> 22 <property name="hibernate.hbm2ddl.auto">update</property> 23 <!-- 6. 引入ORM对象定义文件 --> 24 <mapping resource="com/leo/domain/User.hbm.xml"/> 25 </session-factory> 26 </hibernate-configuration>
对于hibernate.hbm2ddl.auto而言有四种配置值:
#1 create-drop:程序执行开始重新创建新表,程序执行结束则删除所有的数据和表结构;
#2 create:程序执行开始重新创建新表;
#3 update:推荐值,程序执行开始会检查表是否存在,如果不存在则创建新表,如果存在则检查表结构是否跟配置文件一致,如果不一致则更新表结构;
#4 validate:程序开始会检查表是否存在,如果不存在或者表结构不一致,则会抛异常;
创建基于DBCP PooledDataSource和Spring TxManager的hibernateSessionFactory如下,其中最后三个配置项表示开启并使用二级缓存,factory_class依赖Ehcache,可以有两种选择,EhCacheRegionFactory和SingletonEhCacheRegionFactory,前者用于一个app中支持多个dataSource的场景,后者仅支持一个dataSource的场景,hibernate-ehcache.xml用于配置二级缓存具体的策略;
1 <!-- Using DBCP as pooled data source --> 2 <bean id="dataSource" 3 class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 4 <property name="driverClassName" value="${jdbc.driverClassName}"/> 5 <property name="url" value="${jdbc.url}"/> 6 <property name="username" value="${jdbc.username}"/> 7 <property name="password" value="${jdbc.pwd}"/> 8 <property name="defaultAutoCommit" value="true"/> 9 <property name="initialSize" value="10000"/> 10 <property name="maxActive" value="10000"/> 11 <property name="maxIdle" value="10000"/> 12 <property name="minIdle" value="10000"/> 13 <property name="maxWait" value="10000"/> 14 </bean> 15 16 <!-- Using spring transaction --> 17 <bean id="transactionManager" 18 class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 19 <property name="sessionFactory" ref="hibernateSessionFactory"/> 20 </bean> 21 22 <tx:annotation-driven transaction-manager="transactionManager"/> 23 24 <!-- Configuring sessionFactory --> 25 <bean id="hibernateSessionFactory" 26 class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 27 <property name="dataSource" ref="dataSource"/> 28 <property name="mappingResources"> 29 <list> 30 <value>META-INF/hibernate-named-query.xml</value> 31 </list> 32 </property> 33 <property name="hibernateProperties"> 34 <props> 35 <prop key="hibernate.dialect"> 36 com.active.services.persistence.SQLServer2005Dialect 37 </prop> 38 <prop key="hibernate.hbm2ddl.auto">none</prop> 39 <prop key="hibernate.connection.release_mode">auto</prop> 40 <prop key="hibernate.show_sql">true</prop> 41 <prop key="hibernate.format_sql">true</prop> 42 <prop key="hibernate.use_sql_comments">true</prop> 43 <prop key="hibernate.generate_statistics">true</prop> 44 <prop key="hibernate.jdbc.use_scrollable_resultset">true</prop> 45 <prop key="hibernate.jdbc.use_streams_for_binary">true</prop> 46 <prop key="hibernate.jdbc.batch_size">100</prop> 47 <prop key="hibernate.cache.region_prefix">hibernate.cache</prop> 48 <prop key="hibernate.cache.use_query_cache">true</prop> 49 <prop key="hibernate.cache.use_second_level_cache">true</prop> 50 <prop key="hibernate.cache.region.factory_class"> 51 net.sf.ehcache.hibernate.EhCacheRegionFactory 52 </prop> 53 <prop key="net.sf.ehcache.configurationResourceName"> 54 META-INF/hibernate-ehcache-config.xml 55 </prop> 56 </props> 57 </property> 58 </bean>