Struts2+hibernate+spring 配置事物

今天自信看了看hibernate的东西配置问题,转载了其他人的日记,仅用来修。

struts+hibernate+spring事务配置

(2009-01-14 21:49:47)

ACCESS 1转载

标签:

it

分类: 框架整合

Struts+hibernate+spring整合出web应用是相当风行的,只待简单的配备就能够轻轻松松的针对性数据库进行crud操作,下面就是hibernate+spring的部署做一下解析,一边跟大家一块儿享受经历:

1、  准备干活:

足运用hibernate
tools生成相关映射文件已po对象、dao对象,dao也可以好手动编写,无非就是是落实crud,如果由此连续hibernate提供的HibernateDaoSupport,则足以还轻松的贯彻

一言九鼎就在于配备文件,下面看一个样例app.xml:

<?xml version=”1.0″ encoding=”utf-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans”

       xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

       xsi:schemaLocation=”http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"&gt;

<!–配置数据源–>

<bean id=”dataSource”
class=”com.mchange.v2.c3p0.ComboPooledDataSource”
destroy-method=”close”>

       <!– 指定连接数据库的叫 –>

       <property name=”driverClass”
value=”com.mysql.jdbc.Driver”/>

       <!– 指定连接数据库的URL –>

       <property name=”jdbcUrl”
value=”jdbc:mysql://localhost/auction”/>

       <!– 指定连接数据库的用户名 –>

       <property name=”user” value=”root”/>

       <!– 指定连接数据库的密码 –>

       <property name=”password” value=”root”/>

       <!– 指定连接数据库连接池的极度深连接数 –>

       <property name=”maxPoolSize” value=”20″/>

       <!– 指定连接数据库连接池的无比小连数 –>

       <property name=”minPoolSize” value=”1″/>

       <!– 指定连接数据库连接池的初始化连接数 –>

       <property name=”initialPoolSize” value=”1″/>

       <!– 指定连接数据库连接池的总是的最酷空闲时 –>

       <property name=”maxIdleTime” value=”20″/>

    </bean>

   

    <!–配置数据库会话工厂–>

    <bean id=”sessionFactory”
class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>

       <property name=”dataSource” ref=”dataSource”/>

       <property name=”mappingResources”>

           <list>

              <value>com/ouya/User.hbm.xml</value>

           </list>

       </property>

        <property name=”hibernateProperties”>

    <props>

     <prop
key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>

     <prop key=”hibernate.show_sql”>true</prop>

     <prop
key=”hibernate.cglib.use_reflection_optimizer”>true</prop>

    </props>

   </property> 

    </bean>

 

<!–配置事务管理器–>

<bean id=”transactionManager”
class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>

   <property name=”sessionFactory”><ref
local=”sessionFactory”/></property>

</bean>

    <!—-配置Spring 事务管理器代理 –>

<bean id=”transactionProxyFactory” abstract=”true” lazy-init=”true”
class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>

    <property name=”transactionManager”>

         <ref local=”transactionManager”/>

    </property>

    <property name=”transactionAttributes”>

         <props>

          <prop key=”save*”>PROPAGATION_REQUIRED</prop>

           <prop key=”insert*”>PROPAGATION_REQUIRED</prop>

           <prop key=”del*”>PROPAGATION_REQUIRED</prop>

           <prop key=”add*”>PROPAGATION_REQUIRED</prop>

           <prop key=”update*”>PROPAGATION_REQUIRED</prop>

           <prop
key=”find*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”search*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”remove*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”query*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”list*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”count*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”get*”>PROPAGATION_REQUIRED,readOnly</prop>

    </props>

   </property>

    </bean>

    <!– Hibernate模板 –>

<bean id=”hibernateTemplate”
class=”org.springframework.orm.hibernate3.HibernateTemplate”>

   <property name=”sessionFactory”>

    <ref local=”sessionFactory” />

   </property>

</bean>

    <!–服务层对象–>

    <bean id=”us” class=”com.ouya.UserService”>

     <property name=”userDao”>

      <ref local=”userDao”/>

     </property>

    </bean>

    <!– spring代理用户服务对象 –>

<bean id=”userService” parent=”transactionProxyFactory”>

<!–
如果上面的服务层对象实现了接口,则此处必须装proxyTargetClass为true,否则会报classcast异常
–>

<!–<property name=”proxyTargetClass” value=”true”/>–>

       <property name=”target” ref=”us”/>

</bean>

    <!– 用户数量看对象DATA ACCESS OBJECT –>

<bean id=”userDao” class=”com.ouya.UserDAO”>

   <property name=”hibernateTemplate” ref=”hibernateTemplate”/>

</bean>

    </beans>

足见到配置文件之步调:

1、  配置数据源

2、 
配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[小心是的职位]、hibernate属性文件)

3、  配置事务管理器(依赖注入上面的对话工厂)

4、 
Spring中宣示事务管理器(根据需要同时可分为几种,但都如因注入上面的事务管理器,此外还欲配备transationAttributes)

末尾的一部分家常的bean配置就毫无说了

地方的事例中利用的扬言事务管理器是:TransactionProxyFactoryBean,这样的话我们就得在后配置目标bean,
比如上面的例子中我们的原本劳动目标是id为us的UserService(没有兑现接口),所以我们也外布置了id为userService的代理对象
(目标bean),程序中利用时就会由此运用代理对象才能够兑现数据库操作功能(代理对象的父类是地方声明的事务管理器,一边我们用的下打开事务),如
果直接以服务对象就是无法打开事务

次第中调用:UserService us = (UserService) app.getBean(“userService”);

横流:userService就是点配置的代理对象的id,而未是本来劳动目标的id

 

只是若我们想透过本劳动目标的id来用对象,则我们要以代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的布置文件需要开变更,做简单项事(当然先要去除原来配置的TransactionProxyFactoryBean,不然就是乱了,可能会见报错的):

1、  增加一个政工拦截器

<bean id=”transactionInterceptor”
class=”org.springframework.transaction.interceptor.TransactionInterceptor”>

    <property name=”transactionManager”>

         <ref local=”transactionManager”/>

    </property>

    <property name=”transactionAttributes”>

         <props>

          <prop key=”save*”>PROPAGATION_REQUIRED</prop>

           <prop key=”insert*”>PROPAGATION_REQUIRED</prop>

           <prop key=”del*”>PROPAGATION_REQUIRED</prop>

           <prop key=”add*”>PROPAGATION_REQUIRED</prop>

           <prop key=”update*”>PROPAGATION_REQUIRED</prop>

           <prop
key=”find*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”search*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”remove*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”query*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”list*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”count*”>PROPAGATION_REQUIRED,readOnly</prop>

           <prop
key=”get*”>PROPAGATION_REQUIRED,readOnly</prop>

    </props>

   </property>

</bean>

2、  定义自动代理事务管理器

<!– 定义BeanNameAutoProxyCreator–>

<bean
class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>

<!– 
如果服务层对象是接口实现类似,则用安装proxyTargetClass属性为true –>

<!–<property name=”proxyTargetClass” value=”true”–>

        <!–  指定对满足哪些bean name的bean自动生成业务代理 –>

        <property name=”beanNames”>

            <!–  下面是装有需要活动创建工作代理的bean–>

            <list>

                <value>us</value>

            </list>

            <!–  此处可增加其他需要活动创建工作代理的bean–>

        </property>

        <!–  下面定义BeanNameAutoProxyCreator所用的事体拦截器–>

        <property name=”interceptorNames”>

            <list>

                <!– 此处可长其他新的Interceptor –>

                <value>transactionInterceptor</value>

            </list>

        </property>

</bean>

接下来我们在先后中调用时应如下:

UserService us = (UserService) app.getBean(“us”);

横流:注意与地方使用TransactionProxyFactoryBean时之调用区别,此处我们因而getbean时直取原服务层对象的id,不待去安排目标bea,这也正是

BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所在

 

 

 

 

附录:

1、关于hibernate的属性详解:

<bean id=”dataSource”
class=”com.mchange.v2.c3p0.ComboPooledDataSource”
destroy-method=”close”>

<!– 以下配置都是采用 jdbc.properties
属性文件被之布,而用可如此勾画,就是因生 属性占位符配置的因由
–>

<property name=”driverClass” value=”${jdbc.driverClassName}”/>

<property name=”jdbcUrl” value=”${jdbc.url}”/>

<property name=”user” value=”${jdbc.username}”/>

<property name=”password” value=”${jdbc.password}”/>

<!– 连接池维持的极小的连个数 –>

<property name=”minPoolSize” value=”5″/>

<!– 连接池维持的太酷之连日个数 –>

<property name=”maxPoolSize” value=”20″/>

<!– 最要命空闲时间,
当某个连接于这个时刻内没有倒后将起池塘中移除,前提是池子中足足多于最少的连接数:
minPoolSize –>

<property name=”maxIdleTime” value=”1800″/>

<!– 为提高准备语句的执行性,此参数指定为缓存的 PreparedStatement
的个数 –>

<property name=”maxStatements” value=”50″/>

</bean>

 

Hibernate 会话厂 SessionFactory

Session 就是用来每次与数据库会话的,因此用:

数据库的配置参数,这些参数就是 上面的数据源指定的!
因此我们只有待引用即可: ref=”dataSource”;

实体映射配置 hibernate.cfg.xml 配置

结果缓存配置(这里以的是开源的 ehcache)

 

<!– Hibernate SessionFactory –>

<bean id=”sessionFactory”
class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>

<!– 引用前定义的数目源 –>

<property name=”dataSource” ref=”dataSource”/>

<!– 所有实体映射文件列表, 所有的 hbm.xml 文件 –>

<property name=”mappingResources”>

<list>

<value>org/springframework/samples/jpetstore/domain/Account.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Banner.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Category.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Inventory.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Item.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/LineItem.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Order.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Product.hbm.xml</value>

<value>org/springframework/samples/jpetstore/domain/Supplier.hbm.xml</value>

</list>

</property>

<!– 传统上之 hibernate.cfg.xml 文件的参数放在这里 –>

<property name=”hibernateProperties”>

<props>

<!– 指定数据库方言 –>

<prop key=”hibernate.dialect”>${hibernate.dialect}

</prop>

<!– 是否以日记被输出所有Hibernate与数据库交互的SQL语句 –>

<prop key=”hibernate.show_sql”>true</prop>

<!– 是否在日记被输出的SQL 语句格式化成易读形式 –>

<prop key=”hibernate.format_sql”>true</prop>

<!– 是否出示统计形式,一般在测试阶段使用 –>

<prop key=”hibernate.generate_statistics”>true</prop>

<!– 对于级联查询,一次性取得之级联深度, @todo 需更研究 –>

<prop key=”hibernate.max_fetch_depth”>2</prop>

<!–

Fetch Size
是设定JDBC的Statement读取数据的时光每次从数据库被收获有之记录条数,一般设置也30、50、100。

Oracle数据库的JDBC驱动默认的Fetch Size=15,设置Fetch
Size设置也:30、50,性能会发生拨云见日提升,如果后续增大,

超出100,性能提升非醒目,反而会损耗内存。

–>

<prop key=”hibernate.jdbc.fatch_size”>100</prop>

<!–

不要等交一起到50独SQL之后才执行.只要事务commit后,不管缓存中起稍许条sql语句都要执行.

hibernate.jdbc.batch_size参数就是设定一次等顶多好交给多少sql语句的上限,提高sql语句之行效率

–>

<prop key=”hibernate.jdbc.batch_size”>50</prop>

<!–

(1)create 在每次SesstionFactory
构建时(一般是采用还开时,或者伴随在应用服务器重启时),先用前数据库被的有数据均

辖清空,后跟随根据所有的hbm.xml 映射文件再度创设新的数据库表

 

(2)create-drop 除了create
的具备含义之外,在每次用之脱离前,将进行相同不成数据空清空。因此这布局将发零星坏清空操作,

一致次是脱离,一软是启动时。

 

(3)update

一经当开发阶段理发了实体对象的炫耀文件(hbm.xml)
的定义后,此安排将后台的数据库表进行创新(如增加表的排)

 

(4)validate

用来校验现有的表明及现有的布是否相同。

–>

<prop key=”hibernate.hbm2ddl.auto”>update</prop>

<!– 见下面的诠释 –>

<prop key=”hibernate.hbm2ddl.auto”>update</prop>

<!–结果缓存配置:- 将ehcache.xml 置于 classpath 中-
如果非装“查询缓存”,

这就是说hibernate只见面缓存使用load()方法得到的么持久化对象,如果想缓存使用findall()、
list()、

Iterator()、createCriteria()、createQuery()等办法获得的数码结果集的话,就得设置

hibernate.cache.use_query_cache true 才行- 在Hbm文件被上加<cache
usage=”read-only”/>-

如若用“查询缓存”,还欲以采用Query或Criteria()时设置其setCacheable(true);属性–>

<prop key=”hibernate.cache.use_query_cache”>true</prop>

<prop
key=”hibernate.cache.provider_class”>org.hibernate.cache.EhCacheProvider</prop>

</props>

</property>

<!– 也缓解 merge()方法语义的歧义 @todo
以后更加分析或者您可扣押一下对应的文档 –>

<property name=”eventListeners”>

<map><entry key=”merge”>

<bean
class=”org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener”/>

</entry></map>

</property>

</bean>

 

2、Spring的transactionAttributes

 

PROPAGATION_REQUIRED:支持即业务,如果手上没事情,就新建一个事情。这是绝普遍的选项。

PROPAGATION_SUPPORTS:支持时作业,如果手上不曾工作,就因非事务方式实施。

PROPAGATION_MANDATORY:支持时政工,如果手上尚未工作,就丢来好。

PROPAGATION_REQUIRES_NEW:新建事务,如果手上在业务,把当前事情挂于。

PROPAGATION_NOT_SUPPORTED:以非事务方式实行操作,如果手上留存工作,就管当下业务挂于。

PROPAGATION_NEVER:以非事务方式履行,如果手上有工作,则抛来深。

PROPAGATION_NESTED:如果手上设有业务,则于嵌套事务内实行。如果手上没事情,则展开和PROPAGATION_REQUIRED类似之操作。

相关文章