Struts2+hibernate+spring 配置事物

明日满怀信心看了看hibernate的东西配置问题,转发了其余人的日志,仅用来学学。

struts+hibernate+spring事务配置

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

图片 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(Service) us = (User瑟维斯(Service)(Service)) app.getBean(“user瑟维斯(Service)”);

注:user瑟维斯(Service)就是地方配置的代理对象的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类似的操作。

相关文章