Spring3+Hibernate3+Atomikos集成构建JTA的分布式事务(一)

集成Hibernate

公司项目使用阿里巴巴的Druid数据源来支持分布式的事务操作。

引入jar包

druid-1.0.23.jar
hibernate-3.5.5-Final.jar
hibernate-entitymanager.jar
hibernate-jpa-2.0-api-1.0.1.final.jar
hibernate-validator.jar
mysql-connector-java-5.1.38-bin.jar

hibernate属性文件

hibernate.properties

#Hibernate 配置  

#hibernate方言   依次为:  mysql5,mysqlInnoDB(推荐),SQLServer,HSQL,Oracle9i以上版本
#hibernate.dialect=org.hibernate.dialect.MySQLDialect
#hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.dialect=hibernate.Dialect

#auto = none: 不做任何操作
#create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行。会导致数据库表数据丢失。
#create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
#update:第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
#validate:验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
hibernate.hbm2ddl.auto=none

#关于hibernate.jdbc.fetch_size与hibernate.jdbc.batch_size的设置,可能会将严重影响Hibernate的CRUD性能。
#设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。
#Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。
#MySQL就支持Fetch Size特性
hibernate.jdbc.fetch_size=100
#设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小。
#Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。
hibernate.jdbc.batch_size=50


#显示SQL语句,如果不想让SQL在控制台输出,以下的三项全部设置为false
hibernate.show_sql=true
#格式化SQL语句
hibernate.format_sql=true
#如果设置为true,Hiberante将为SQL产生注释,这样更利于调试。默认值为false。
hibernate.use_sql_comments=false

配置hibernate属性

applicationContext.xml

<!--1. 读取配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath*:jdbc.properties</value>
            <value>classpath*:hibernate.properties</value>
        </list>
    </property>
</bean>

<!--配置hibernate属性 -->
<bean name="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
            <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>
        </props>
    </property>
</bean>

<!--2. 配置sessionFactory工厂Bean和事务管理器。见spring集成Atomikos,第二篇 -->


<!--3、配置tx/aop声明式事务, 声明一个切面 --> 
<tx:advice id="txWorksysAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" isolation="DEFAULT" />
    <!-- 
        <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception" isolation="DEFAULT" />
        <tx:method name="save*"   propagation="REQUIRED" rollback-for="Exception"/> 
        <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="get*"    propagation="REQUIRED" no-rollback-for="Exception" read-only="true"/>
        <tx:method name="find*"   propagation="REQUIRED" rollback-for="Exception" read-only="true" />  
      -->
    </tx:attributes>
</tx:advice>

<!-- 4、把切面注入到业务中 -->
<aop:config proxy-target-class="true">
    <aop:advisor pointcut="execution(* com.juttec..*.service.*.*(..))" advice-ref="txWorksysAdvice" />
<!--        <aop:advisor advice-ref="txWorksysAdvice" pointcut="execution(* org.snaker.engine.core..*.*(..))"/> -->
</aop:config>   

<!-- 针对注解的处理器配置 -->
<context:annotation-config />
<!-- 使用 annotation 自动注册bean,并检查@Controller, @Service, @Repository注解已被注入 -->
<context:component-scan base-package="com.juttec">
</context:component-scan>

<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
<tx:annotation-driven proxy-target-class="true"/>  

==注意==:本来要配置transaction-manager属性,如:。这里没有配置是因为它的默认值是transactionManager。

配置sessionFactory类

MainDaoSupport.java

package com.juttec.core.dao;

import java.io.Serializable;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class MainDaoSupport<T, PK extends Serializable> extends HibernateDao<T, PK>
{
  @Autowired
  @Qualifier("mainSessionFactory")
  public void setSessionFactory(SessionFactory sessionFactory)
  {
    super.setSessionFactory(sessionFactory);
  }
}

AppDaoSupport

package com.juttec.core.dao;

import java.io.Serializable;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class AppDaoSupport<T, PK extends Serializable> extends HibernateDao<T, PK>
{
  @Autowired
  @Qualifier("appSessionFactory")
  public void setSessionFactory(SessionFactory sessionFactory)
  {
    super.setSessionFactory(sessionFactory);
  }
}

上面的基类HibernateDao.java详见《==继承DaoSupport实现自己的DAO基类==》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值