applicationContext.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" xmlns:jee="http://www.springframework.org/schema/jee"
- xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-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/jee
- http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd"
- default-lazy-init="true">
- <description>Spring公共配置 </description>
- <!-- 定义受环境影响易变的变量 -->
- <bean
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
- <property name="ignoreResourceNotFound" value="true" />
- <property name="locations">
- <list>
- <!-- 标准配置 -->
- <value>classpath*:/application.properties</value>
- <!--
- 集群中节点配置 <value>classpath*:/application.cluster.properties</value>
- -->
- <!--
- 本地开发环境配置 <value>classpath*:/application.local.properties</value>
- -->
- <!--
- 服务器生产环境配置 <value>/pom/application.server.properties</value>
- -->
- </list>
- </property>
- </bean>
- <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
- <context:component-scan base-package="com.wiseweb.pom" />
- <!-- orable配置 -->
- <!-- <bean id="dataSourceContent" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
- <property name="uniqueResourceName">
- <value>jdbc/dataSourceContent</value>
- </property>
- <property name="xaDataSourceClassName">
- <value>oracle.jdbc.xa.client.OracleXADataSource</value>
- </property>
- <property name="xaProperties">
- <props>
- <prop key="URL">${jdbc.url}</prop>
- <prop key="user">${jdbc.username}</prop>
- <prop key="password">${jdbc.password}</prop>
- </props>
- </property>
- <property name="poolSize">
- <value>5</value>
- </property>
- <property name="maxPoolSize">
- <value>15</value>
- </property>
- </bean>
- <bean id="dataSourceIndex" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
- <property name="uniqueResourceName">
- <value>jdbc/dataSourceIndex</value>
- </property>
- <property name="xaDataSourceClassName">
- <value>oracle.jdbc.xa.client.OracleXADataSource</value>
- </property>
- <property name="xaProperties">
- <props>
- <prop key="URL">${jdbc.url}</prop>
- <prop key="user">${jdbc.username}</prop>
- <prop key="password">${jdbc.password}</prop>
- </props>
- </property>
- <property name="poolSize">
- <value>5</value>
- </property>
- <property name="maxPoolSize">
- <value>15</value>
- </property>
- </bean> -->
- <!-- 本地数据库配置 -->
- <bean id="dataSourceContent" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
- <property name="uniqueResourceName">
- <value>jdbc/dataSourceContent</value>
- </property>
- <property name="xaDataSourceClassName">
- <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
- </property>
- <property name="xaProperties">
- <props>
- <prop key="serverName">${jdbc.servername}</prop>
- <prop key="portNumber">${jdbc.portnumber}</prop>
- <prop key="databaseName">${jdbc.databasename}</prop>
- <prop key="user">${jdbc.username}</prop>
- <prop key="password">${jdbc.password}</prop>
- </props>
- </property>
- <property name="poolSize">
- <value>5</value>
- </property>
- <property name="maxPoolSize">
- <value>15</value>
- </property>
- <property name="testQuery">
- <value>select 1</value>
- </property>
- </bean>
- <bean id="dataSourceIndex" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
- <property name="uniqueResourceName">
- <value>jdbc/dataSourceIndex</value>
- </property>
- <property name="xaDataSourceClassName">
- <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
- </property>
- <property name="xaProperties">
- <props>
- <prop key="serverName">${jdbc.servername_index}</prop>
- <prop key="portNumber">${jdbc.portnumber_index}</prop>
- <prop key="databaseName">${jdbc.databasename_index}</prop>
- <prop key="user">${jdbc.username_index}</prop>
- <prop key="password">${jdbc.password_index}</prop>
- </props>
- </property>
- <property name="poolSize">
- <value>5</value>
- </property>
- <property name="maxPoolSize">
- <value>15</value>
- </property>
- <property name="testQuery">
- <value>select 1</value>
- </property>
- </bean>
- <!-- 数据源配置,使用应用内的DBCP数据库连接池
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- Connection Info
- <property name="driverClassName" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- Connection Pooling Info
- <property name="maxIdle" value="${dbcp.maxIdle}" />
- <property name="maxActive" value="${dbcp.maxActive}" />
- <property name="defaultAutoCommit" value="false" />
- <property name="timeBetweenEvictionRunsMillis" value="3600000" />
- <property name="minEvictableIdleTimeMillis" value="3600000" />
- </bean>
- --><!-- 数据源配置,使用应用服务器的数据库连接池 -->
- <!--
- <jee:jndi-lookup id="dataSource"
- jndi-name="java:comp/env/jdbc/ExampleDB" />
- -->
- <!-- Hibernate配置
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="namingStrategy">
- <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">${hibernate.dialect}</prop>
- <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
- <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
- <prop key="hibernate.cache.use_second_level_cache">${hibernate.use_second_level_cache}</prop>
- <prop key="hibernate.cache.use_query_cache">${hibernate.use_query_cache}</prop>
- <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
- <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
- </props>
- </property>
- <property name="packagesToScan" value="com.wiseweb.pom.entity" />
- </bean>
- -->
- <!-- Hibernate配置 -->
- <!-- 本地数据库Hibernate配置 -->
- <bean id="sessionFactoryContent" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <property name="dataSource" ref="dataSourceContent" />
- <property name="namingStrategy">
- <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
- <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
- <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
- <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
- <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
- </props>
- </property>
- <property name="packagesToScan" value="com.wiseweb.pom.entity" />
- </bean>
- <!-- 远程数据库Hibernate配置 -->
- <bean id="sessionFactoryIndex" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <property name="dataSource" ref="dataSourceIndex" />
- <property name="namingStrategy">
- <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
- <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
- <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
- <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
- <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
- </props>
- </property>
- <property name="packagesToScan" value="com.wiseweb.pom.entity" />
- </bean>
- <!-- 事务管理器配置,单数据源事务
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- -->
- <!-- ActiveMQ JMS服务 -->
- <!--创建连接工厂-->
- <bean id="connectionFactory"
- class="org.apache.activemq.ActiveMQConnectionFactory">
- <property name="brokerURL" value="tcp://127.0.0.1:61616"></property>
- </bean>
- <!-- 声明ActiveMQ队列消息目标-->
- <!-- <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
- <constructor-arg index="0" value="wiseweb.queue"></constructor-arg>
- </bean> -->
- <!-- 声明ActiveMQ主题消息目标 -->
- <bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
- <constructor-arg index="0" value="wiseweb.topic"></constructor-arg>
- </bean>
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory" ref="connectionFactory"></property>
- <property name="defaultDestination" ref="destination"></property>
- <property name="receiveTimeout" value="10000"></property>
- </bean>
- <!-- 消息监听适配器 -->
- <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <property name="delegate">
- <bean class="com.wiseweb.pom.jms.listener.MessageListener"></bean>
- </property>
- <property name="defaultListenerMethod" value="receiveMessage"></property>
- <property name="defaultResponseDestination" ref="destination"></property>
- </bean>
- <!-- 监听容器 -->
- <!-- <bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="connectionFactory"></property>
- <property name="destination" ref="destination"></property>
- <property name="messageListener" ref="messageListenerAdapter"></property>
- </bean> -->
- <bean id="messageSender" class="com.wiseweb.pom.jms.MessageSender">
- <property name="jmsTemplate" ref="jmsTemplate"></property>
- </bean>
- <!-- 事务管理器配置,多数据源JTA事务-->
- <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
- <property name="forceShutdown"><value>true</value></property>
- </bean>
- <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
- <property name="transactionTimeout" value="300"/>
- </bean>
- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
- <property name="transactionManager" ref="atomikosTransactionManager" />
- <property name="userTransaction" ref="atomikosUserTransaction"/>
- <property name="allowCustomIsolationLevels" value="true"/>
- </bean>
- <!-- 使用annotation定义事务 -->
- <tx:annotation-driven transaction-manager="transactionManager"
- proxy-target-class="true" />
- <!-- 加载网站类型 -->
- <bean id="groupMap" class="java.util.TreeMap">
- <constructor-arg>
- <map>
- <entry key="1" value="新闻" />
- <entry key="2" value="论坛" />
- <entry key="3" value="博客" />
- <entry key="4" value="微博" />
- <entry key="5" value="纸媒" />
- <!-- <entry key="6" value="视频" />-->
- <entry key="7" value="外媒" />
- <!-- <entry key="8" value="广播" />
- <entry key="9" value="电视" />
- <entry key="10" value="空间" />
- <entry key="11" value="微信" />-->
- </map>
- </constructor-arg>
- </bean>
- <bean id="staticValue" class="com.wiseweb.util.StaticValue"
- lazy-init="false">
- <property name="groupMap">
- <ref bean="groupMap" />
- </property>
- </bean>
- <bean id="hibernateDaoImple" class="com.wiseweb.pom.dao.HibernateGeneralDao">
- <property name="sessionFactory" ref="sessionFactoryContent"></property>
- </bean>
- <!-- 配置定时器 -->
- <bean id="scheduler"
- class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- </bean>
- <bean id="quartzTimerUtil" class="com.wiseweb.util.sms.QuartzTimerUtil">
- <property name="scheduler" ref="scheduler" />
- </bean>
- <bean id="startAllTimer" class="com.wiseweb.util.sms.StartAllTimer">
- <property name="scheduler" ref="scheduler" />
- <property name="hibernateDaoImple" ref="hibernateDaoImple"></property>
- </bean>
- <!-- 配置定时器结束 -->
- </beans>
- package com.wiseweb.pom.dao.account;
- import javax.annotation.Resource;
- import org.hibernate.SessionFactory;
- import org.springframework.stereotype.Component;
- import org.springside.modules.orm.hibernate.HibernateDao;
- import com.wiseweb.pom.entity.Company;
- /**
- * HibernateDao中的Company是实体类
- * @author Benjamin
- *
- */
- @Component
- public class CompanyDao extends HibernateDao<Company, Long>
- {
- //选择applicationContext中名为sessionFactoryContent的sessionFactory注入,实现多数据源访问
- @Override
- @Resource(name = "sessionFactoryContent")
- public void setSessionFactory(SessionFactory sessionFactory) {
- // TODO Auto-generated method stub
- super.setSessionFactory(sessionFactory);
- }
- }
实体类entity
- package com.wiseweb.pom.entity;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.List;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.OneToMany;
- import javax.persistence.Table;
- import javax.persistence.Transient;
- @Entity
- @Table(name="wise_company")
- public class Company implements Serializable{
- /**
- *
- */
- private Long id ;
- private static final long serialVersionUID = 1L;
- private String name ;
- private Integer grade ;
- private Long parentId ;
- private Integer nodeType ;
- private Integer orderType ;
- private Integer flag ;
- private Company fCompany ;
- private List<Department> departments = new ArrayList<Department>() ;
- private Long companyNum ;
- private Long childNum ;
- private List<Company> childCompanys = new ArrayList<Company>() ;
- @Column(name="name", nullable=false, length=45)
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Column(name="grade", nullable=false)
- public Integer getGrade() {
- return grade;
- }
- public void setGrade(Integer grade) {
- this.grade = grade;
- }
- @Column(name="parent_id", nullable=false)
- public Long getParentId() {
- return parentId;
- }
- public void setParentId(Long parentId) {
- this.parentId = parentId;
- }
- @Column(name="node_type", nullable=false)
- public Integer getNodeType() {
- return nodeType;
- }
- public void setNodeType(Integer nodeType) {
- this.nodeType = nodeType;
- }
- @Column(name="order_type")
- public Integer getOrderType() {
- return orderType;
- }
- public void setOrderType(Integer orderType) {
- this.orderType = orderType;
- }
- @Column(name="flag", nullable=false)
- public Integer getFlag() {
- return flag;
- }
- public void setFlag(Integer flag) {
- this.flag = flag;
- }
- @OneToMany(mappedBy="company",cascade = {CascadeType.ALL})
- public List<Department> getDepartments() {
- return departments;
- }
- public void setDepartments(List<Department> departments) {
- this.departments = departments;
- }
- @Transient
- public Company getFCompany() {
- return fCompany;
- }
- public void setFCompany(Company fCompany) {
- this.fCompany = fCompany;
- }
- @Id
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- @Transient
- public Long getCompanyNum() {
- return companyNum;
- }
- public void setCompanyNum(Long companyNum) {
- this.companyNum = companyNum;
- }
- @Transient
- public List<Company> getChildCompanys() {
- return childCompanys;
- }
- public void setChildCompanys(List<Company> childCompanys) {
- this.childCompanys = childCompanys;
- }
- @Transient
- public Long getChildNum() {
- return childNum;
- }
- public void setChildNum(Long childNum) {
- this.childNum = childNum;
- }
- }
下面最重要的是service层,必须要加上@Transactional不然会报the XA resource is currently involved in a local (non-XA) transaction的错误。
- @Component
- @Transactional
- public class AccountManager {
- ...
- }
最后就可以通过指定不通的sessionFactory访问不同的数据库了。