Hi Everyone,
I find a solution to connect multiple DB per one transaction using Hibernate, Struts2 and Spring.
To do that in your project, you need to add Spring Jars:
org.springframework.aop-3.0.5.RELEASE.jar
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.aspects-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.context.support-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.instrument-3.0.5.RELEASE.jar
org.springframework.instrument.tomcat-3.0.5.RELEASE.jar
org.springframework.jdbc-3.0.5.RELEASE.jar
org.springframework.jdbc.jar
org.springframework.jms-3.0.5.RELEASE.jar
org.springframework.orm-3.0.5.RELEASE.jar
org.springframework.orm.jar
org.springframework.oxm-3.0.5.RELEASE.jar
org.springframework.test-3.0.5.RELEASE.jar
org.springframework.transaction-3.0.0.RELEASE.jar
org.springframework.transaction-3.0.5.RELEASE.jar
org.springframework.web-3.0.2.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.jar
org.springframework.web.portlet-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
org.springframework.web.struts-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-core.jar
commons-dbcp-1.4.jar
commons-pool-1.6.jar
you might don't need all of them.
and here is the file hierarchies:
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dataSourceBean" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sessionFactoryBean"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSourceBean" />
<property name="mappingResources">
<list>
<value>tracking/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
</value>
</property>
</bean>
<bean id="hibernateTemplateBean" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactoryBean" />
</property>
</bean>
<bean id="userDAOBean" class="tracking.UserDAO">
<property name="hibernateTemplate" ref="hibernateTemplateBean" />
</bean>
<bean id="userAction" class="tracking.UserAction">
<property name="userDAO" ref="userDAOBean" />
</bean>
</beans>
UserAction.java
package tracking;
import java.util.ArrayList;
import java.util.List;
import java.sql.Types;
import javax.sql.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import tracking.*;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User>
{
private static final long serialVersionUID = 1L;
private User user = new User();
private UserDAO userDAO;
public User getModel()
{
return user;
}
public String test(){
System.out.println(" I am in test I " );
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml", UserAction.class);
System.out.println("ApplicationContext "+ac );
DataSource dataSource = (DataSource) ac.getBean("dataSourceBean");
// DataSource mysqlDataSource = (DataSource) ac.getBean("mysqlDataSource");
System.out.println("dataSource "+dataSource );
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
System.out.println("jdbcTemplate "+jdbcTemplate );
jdbcTemplate.batchUpdate(new String[] { "update user set idUser = 8 where idUser=1",
"update user set idUser = 9 where idUser=2" });
return Action.SUCCESS;
}
/**
* @return the user
*/
public User getUser()
{
return user;
}
/**
* @param user the user to set
*/
public void setUser(User user)
{
this.user = user;
}
/**
* @return the userDAO
*/
public UserDAO getUserDAO()
{
return userDAO;
}
/**
* @param userDAO the userDAO to set
*/
public void setUserDAO(UserDAO userDAO)
{
this.userDAO = userDAO;
}
}
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
<class name="tracking.User" schema="test" table="user">
<id name="idUser" type="java.lang.Integer">
<column length="15" name="idUser" />
<generator class="assigned" />
</id>
</class>
</hibernate-mapping>
!!!!!!!!!! Important Note !!!!!!!!!!
if you get exception while trying to connect the DB,
TNS:listener does not currently know of SID given in connect descriptor
use this in the applicationContext.xml
<bean id="XXX" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=1.1.1.1) (PORT=1525))(CONNECT_DATA=(SERVICE_NAME=XXX)))"/>
<property name="username" value="xxx" />
<property name="password" value="xxx" />
</bean>
http://www.mkyong.com/spring/spring-jdbctemplate-querying-examples/
http://www.mkyong.com/spring/spring-error-classnotfoundexception-org-springframework-web-context-contextloaderlistener/
http://francisoud.blogspot.com/2008/11/simple-jdbc.html
http://www.nabisoft.com/tutorials/struts2/basic-struts2-project-setup#Step4