1.在web.xml中加入如下配置
<!-- 配置Struts ActionServlet -->
<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/classes/struts-config.xml
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- Spring配置 指定spring配置文件位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:ApplicationContext.xml</param-value>
</context-param>
<!-- 配置OpenEntityManagerInview -->
<filter>
<filter-name>openEntityManagerInView</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openEntityManagerInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 实例化Spring容器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2.Spring的配置文件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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">
<!-- 启用支持Annotation注解方式的Bean管理 -->
<context:component-scan base-package="com.kay"></context:component-scan>
<!-- 启用支持Annotation注解方式的事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- JPA事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory">
</property>
</bean>
<!-- C3P0数据源配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///jpa"/>
<property name="maxIdleTime" value="30"/>
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password">root</prop>
<prop key="c3p0.acquire_increment">2</prop>
<prop key="c3p0.max_size">20</prop>
<prop key="c3p0.min_size">1</prop>
</props>
</property>
</bean>
<!-- 声明EntityManagerFactory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"></property>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
</bean>
</beans>
3.struts-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans></form-beans>
<action-mappings>
<action path="/user" parameter="method">
</action>
</action-mappings>
<!-- 将Action交由Spring去管理 -->
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
</struts-config>
4.jpa配置文件persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
注意在DAO中获取EntityManager的方式:
package com.kay.dao;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import com.kay.pojo.User;
@Repository
public class UserDAO{
@PersistenceContext
private EntityManager manager;
public EntityManager getManager()
{
return manager;
}
public User findById(int id)
{
return getManager().find(User.class, id);
}
public void add(User user)
{
getManager().persist(user);
getManager().flush();
}
}
在Service中加入事务支持:
package com.kay.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.kay.dao.UserDAO;
import com.kay.pojo.User;
@Service
@Transactional
public class UserService {
@Resource
private UserDAO userDAO;
public void add(User user)
{
userDAO.add(user);
}
public User findById(int id)
{
return userDAO.findById(id);
}
}
运行的容器为tomcat,并没有使用JBOSS等EJB容器,如果在DAO获取EntityManager或EntityManagerFactory的方式使用@Resource方式,
则会抛出javax.persistence.TransactionRequiredException: no transaction is in progress异常,所以各位必须注意EntityManager的获取方式。