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>
dao层
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访问不同的数据库了。
时间: 2024-12-28 02:18:42