配置 spring mvc + hibernate , 我在配置文件配置了注解的事务,但是controller 没写上@transaction 数据竟然插入到了数据库, 我都把事务的配置文件给干掉了也是提交到了数据库, 看了半天找不到, 帮忙看看,谢谢! 用的是sql server 数据库
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/spring/spring.xml</param-value> </context-param> <!-- 配置DispatcherServlet--> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/spring/springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- 监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <!-- security --> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.do</welcome-file> </welcome-file-list> </web-app>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <!-- 自动扫描的包名 --> <context:component-scan base-package="com.belief.web.controller.**"></context:component-scan> <bean id="springContextUtil" class="com.belief.web.common.util.SpringContextUtil" ></bean> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename"> <value>/WEB-INF/message/message</value> </property> <property name="cacheSeconds"> <value>-1</value> </property> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean> <!-- 默认的注解 --> <!-- <mvc:annotation-driven/> --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <!-- <property name="interceptors"> <list> <bean class="com.belief.web.common.MyIntercepter"></bean> 国际化拦截器配置 <bean id="localResolver" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </list> </property> --> </bean> <!-- 手动注册注解 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="byteArray_hmc" /> <ref bean="string_hmc" /> <ref bean="resource_hmc" /> <ref bean="source_hmc" /> <ref bean="xmlAware_hmc" /> <ref bean="jaxb2Root-hmc" /> <ref bean="jackson_hmc" /> </list> </property> </bean> <bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> <bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name ="supportedMediaTypes"> <list><value>text/plain;charset=UTF-8</value></list> </property> </bean> <bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> <bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> <bean id="xmlAware_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> <bean id="jaxb2Root-hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> <bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> <!-- 试图解析 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/pages/" > <!-- <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=""></property> --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="cookieName" value="clientlanguage"/> <property name="cookieMaxAge"> <value>2592000</value> </property> </bean> <!-- 拦截器 --> <mvc:interceptors> <bean class="com.belief.web.common.intercepter.MyIntercepter"></bean> <!-- 国际化拦截器配置 --> <bean id="localResolver" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> <!-- 单独URL配置拦截器 --> <!-- <mvc:interceptor> <mvc:mapping path="/user/*" /> <bean class="com.belief.web.common.MyIntercepter"></bean> </mvc:interceptor> --> </mvc:interceptors> <!-- 静态资源文件的访问,方案一 --> <mvc:default-servlet-handler/> <!-- 静态资源文件的访问,方案二 cache-period 可以使得静态资源进行web cache --> <!-- <mvc:resources location="/images/" mapping="/images/**" cache-period="31556926" /> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="/css/" mapping="/css/**"/> --> <!-- 全局异常处理 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView"> <value>/error/exception.jsp</value> </property> <!-- 值:“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”,是“SimpleMappingExceptionResolver类的全限定名”。 这个值不是随便写的。 因为我在log4j的配置文件中还要加入 log4j.logger.org.springframework.web.servlet.handler.SimpleMappingExceptionResolver=WARN, 保证这个级别是warn的日志一定会被记录,即使log4j的根日志级别是ERROR。 --> <property name="warnLogCategory"> <value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value> </property> <property name="exceptionMappings"> <props> <prop key="java.lang.IllegalArgumentException">/error/exception.jsp</prop> </props> </property> </bean> </beans>
<?xml version="1.0" encoding="UTF-8"?> <beans default-autowire="byName" 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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" depends-on="propertyConfigurer"> <property name="driver" value="${jdbc.driverClassName}"></property> <property name="driverUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> <!-- 最大连接数(默认5个) --> <property name="maximumConnectionCount"> <value>60</value> </property> <!-- 最小连接数(默认2个) --> <property name="minimumConnectionCount"> <value>10</value> </property> <!-- 同时构建节流 --> <property name="simultaneousBuildThrottle"> <value>10000</value> </property> <!-- 最少保持的空闲连接数(默认2个) --> <property name="prototypeCount"> <value>5</value> </property> <!-- 使用前测试 --> <property name="testBeforeUse"> <value>true</value> </property> <!-- 测试使用的sql --> <property name="houseKeepingTestSql"> <value>select getDate()</value> </property> <!-- 最大活动时间(超过此时间线程将被kill,默认5分钟) --> <property name="maximumActiveTime"> <value>7200000</value> </property> <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒) --> <!-- <property name="houseKeepingSleepTime" value="${proxool.hourseKeepingSleepTime}"/> --> </bean> <!-- 可以在XML配置文件中加入外部属性文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>WEB-INF/config.properties</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" depends-on="propertyConfigurer"> <property name="dataSource"> <ref local="dataSource" /> </property> <property name="mappingResources"> <list> <value>com/belief/web/biz/user/User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <!-- Oracle --> <!-- <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> --> <!-- Sql Server --> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.query.substitutions">true 1, false 0</prop> <!-- 开启二级缓存 --> <!-- <prop key="hibernate.cache.use_second_level_cache">true</prop> --> <!-- 设置缓存类 --> <!-- <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> --> <!-- 否使用结构化的方式缓存对象 --> <!-- <prop key="hibernate.cache.use_structured_entries">true</prop> --> <!-- 是否缓存查询结果 --> <!-- <prop key="hibernate.cache.use_query_cache">true</prop> --> </props> </property> </bean> <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> <property name="sessionFactory"><ref bean="sessionFactory"/></property> </bean> <!-- 配置事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" > <ref local="sessionFactory"/> </property> </bean> <!-- 注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="dao" class="com.belief.web.common.dao.Dao"> </bean> <bean id="daoFactorySupport" class="com.belief.web.common.dao.DaoFactorySupport"> </bean> </beans>
@RequestMapping(value = "/add",method = RequestMethod.POST) public String add(HttpServletRequest request,HttpServletResponse response){ Dao dao = DaoFactory.getInstance().getDao(); User user = new User(); user.setName("hibernate"); user.setState(PojoState.NORMAL); user.setVersion(1); dao.save(user); return "redirect:/index.do"; }
public class User extends BaseEntity { private static final long serialVersionUID = 2274719953051444808L; /** 员工姓名 */ private String name; /** 用户组 */ private String userGroup;
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.belief.web.biz.user.User" table="auth_user"> <!-- <cache usage="read-write" /> --> <id name="id" column="user_id" unsaved-value="null"> <generator class="identity" /> </id> <property name="version" column="version" /> <property name="createTime" column="create_time" /> <property name="updateTime" column="update_time" /> <property name="userGroup" column="user_group" /> <property name="penddingReadAnnonAmt" column="pendding_read_annon_amt" /> <many-to-one name="createUser" column="create_user" class="com.belief.web.biz.user.User" /> <many-to-one name="updateUser" column="update_user" class="com.belief.web.biz.user.User" /> <property name="state" type="com.belief.web.common.entity.PojoStateType" /> <property name="name" /> </class> </hibernate-mapping>
package com.belief.web.common.dao; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.belief.web.common.entity.BaseEntity; @SuppressWarnings("unchecked") public class Dao extends HibernateDaoSupport{ public <T extends BaseEntity>T get(Class<? extends BaseEntity> cls,String id){ return (T) this.getHibernateTemplate().get(cls, id); } public List<BaseEntity> find(Class<? extends BaseEntity> cls){ return this.getHibernateTemplate().find("FROM "+cls.getName()); } public void save(BaseEntity baseEntity){ getHibernateTemplate().save(baseEntity); } }
package com.belief.web.common.dao; public class DaoFactory { private static final DaoFactory instance = new DaoFactory(); public static DaoFactory getInstance() { return instance; } Dao dao; public Dao getDao() { return dao; } }
package com.belief.web.common.dao; public class DaoFactorySupport { public void setDao(Dao dao){ DaoFactory.getInstance().dao = dao; } }