hibernate 学习小结

             hibernate对jdbc做了轻量级的封装,使得我们程序猿直接以面向对象的思维操作数据库。hibernate单纯的使用起来很简单,但是如果什么都不了解在更改的时候会很麻烦。这里记录下一些基本概念方便以后使用

    hibernate 3的持久化状态有三种 transient(瞬时状态) 这个状态可以设置在一对多关系中一的一方,persistent(持久化状态)  和 detached(脱管状态)

    hibernate 3的框架核心为configuration,它负责启动hibernate 3 (这是单独把hibernate拿出来的用法,如果与spring集成则由spring负责启动),hibernate使用主要是通过sessionFactory获得session然后进行数据库操作,如果用config则 new Configuration().configure().buildSessionFactory()的方式获得该对象,如果spring集成的话只需要dao层实现类继承HibernateDaoSupport类直接获得即可。

    hibernate 3的主键生成机制

    Assigned方式表示人工手工生成主键

    Hilo 表示使用高低位算法生成

    Increment 方式表示对主键值采取自动增长方式生成新的主键值,但要求底层数据库支持Sequence

    Identity 方式表示根据底层数据库来支持自动增长,不同的数据库用不同的主键增长方式

    Sequence方式需要底层数据库支持Sequence方式,例如oracle数据库

    Native.方式表示根据不同的底层数据库自动选择Identity,Sequence,Hilo 主键的生成方式。

    UUID 方式表示使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也能够保证在不同数据库及不同服务器下主键唯一性。

   hibernate 两种配置,一种是注解(Annotation) 一种是 xml ,大的工程最好用注解,注解的优先级高于xml(注解算是Hibernate对jpi的支持?),使用注解需要两个对注解提供支持的jar文件,分别是hibernate-annotations.jar 和 ejb3-persistence.jar,注解的方法可以避免那么多的xml文件所以建议大家用注解的方法。

  hibernate 数据库连接池 三种 DBCP,C390以及Proxool。

  hibernate 缓存机制:提供了2级cache 其中一级缓存是Session级别的缓存,二级缓存是SessionFactory 级别的缓存,他书句进程范围或群集范围的缓存,二级缓存可以配置和更改(笔者工程中有设置但是从来没用过- -)二级缓存是一次性获得所有数据对象,并根据ID放入到第二级缓存中,当Hibernate根据ID访问数据对象时首先从一级缓存中查询,如果查询不到,再从二级缓存中查询,如果还是查不到再从数据库查询,把结果按照Id放入到缓存中,删除更新,增加数据时同步更新缓存(CRUD操作是指create,retrieve,update,delete,这个概念小弟今天才知道,太专业了)。

    hibernate 和spring集成的时候设置比较简单,在这里说下直接上代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation=" http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  http://www.springframework.org/schema/jee
  http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"
  default-autowire="byName" default-lazy-init="true">
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="/WEB-INF/jdbc.properties" />
	</bean>
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}"></property>
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="packagesToScan">
			<list>
				<value>com.hrbourse.application.model</value>
				<value>com.hrbourse.hr.model</value>
				<value>com.hrbourse.sys.model</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					<!-- Oracle org.hibernate.dialect.Oracle10gDialect -->
					 <!-- MySql--> org.hibernate.dialect.MySQLDialect 
				</prop>
			<!--<prop key="hibernate.hbm2ddl.auto">create</prop> -->
				<prop key="hibernate.show_sql">false</prop>
				<prop key="hibernate.format_sql">false</prop>
				<prop key="hibernate.jdbc.batch_size">30</prop>
				<prop key="hibernate.default_batch_fetch_size">30</prop>
				<prop key="hibernate.query.substitutions">true 1, false 0</prop>
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.cache.configurationResourceName">/WEB-INF/ehcache.xml</prop>
			</props>
		</property>
	</bean>
	<!--Hibernate TransactionManager -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- 事务增强切面 将com.feiling.dao下以Dao结尾的类纳入事务管理-->
	<aop:config>
		<aop:pointcut id="daoMethod" expression="execution(* com.hrbourse.*.dao.*(..))"/>
		<aop:pointcut id="utilMethod" expression="execution(* com.hrbourse.*.util.*(..))"/>
		<aop:advisor pointcut-ref="daoMethod" advice-ref="txAdvice"/>
		<aop:advisor pointcut-ref="utilMethod" advice-ref="txAdvice"/>
	</aop:config>
	<!-- 事务增强切面END -->
	<!-- 事务增强 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="add*" rollback-for="Exception"/>
			<tx:method name="update*"/>
			<tx:method name="remove*"/>
			<tx:method name="save*"/>
		</tx:attributes>
	</tx:advice>
	<!-- 事务增强END -->
<!--	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">-->
<!--		<property name="sessionFactory" ref="sessionFactory"></property>-->
<!--	</bean>-->
    <context:component-scan base-package="com.hrbourse.*" /><!-- 需要扫描的基类包,Spring容器将会扫描这个基类包里的所有类,并从类的注解信息获得 -->
</beans>

 先从配置文件加载数据库连接需要的东西,创建数据集datasource 对象,该对象又被sessionFactory对象依赖,sessionFactory对象中的<property name="packagesToScan">是指需要扫描的hibernate 注解的持久化类,这些包下的类都是用@注解了的持久化对象,这些对象是使用Criteria 查询,或者调用save,merg等方法时所需要的,没有这些注解你就不能调用serssion的save等方法,当然这些注解跟spring注解无关,spring注解是注入依赖所需要的标识(扯远了)。然后sessionFactory中再加入更过的配置入数据连接池以及二级缓存的配置(使用二级缓存书上说需要激活如query.setCacheable(true))。然后再说明下jpa这个概念 java ,persistent api,是sun公司提供的orm规范化接口。   

posted @ 2013-07-04 22:08  塔塔兔  阅读(273)  评论(0编辑  收藏  举报