@Transactional注释在Spring MVC中不起作用

时间:2017-08-04 07:31:41

标签: java spring hibernate spring-mvc

  

@Transactional在spring mvc中没有工作。假设我删除了   @Transactional注释数据到达RepositoryClass。   Throwable targetException - org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(Object ...)   我需要将数据传输到存储库类。

请帮帮我。, 谢谢。

ServiceImplClass

   @Service("userService")
public class UserServiceImpl implements UserService{

    @Autowired
    UserRepository userRepository;

    public String saveUserData(User user,HttpSession session) {
        return userRepository.saveUserData(user);
    }
}

RepositoryClass:

@Component
@Transactional
public class UserRepository {

@Autowired
protected SessionFactory sessionFactory;

public SessionFactory getSessionFactory() {
    return sessionFactory;
}

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

public String saveUserData(User user) {

    final Session session = (Session) getSessionFactory();
    try {
        session.beginTransaction();
        Query query=session.createQuery("UPDATE User set user_Name =:userName,"
                + "reg_Date =:regDate,"
                + "img_Id=:imgId, emailId =:emailId");
        query.setParameter("userName", user.getUserName());
        query.setParameter("regDate", user.getRegDate());
        query.setParameter("imgId", user.getImgId());
        query.setParameter("emailId", user.getEmailId());
        session.save(user);
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

}

调度-servlet.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:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
                    http://www.springframework.org/schema/context 
                    http://www.springframework.org/schema/context/spring-context-4.2.xsd
                    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
                    ">

    <context:annotation-config />
    <context:component-scan base-package="com.demo.app" />
    <mvc:default-servlet-handler />
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <bean id="jspViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/html/" />
        <property name="suffix" value="html" />
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/UserDB" />
        <property name="username" value="root" />
        <property name="password" value="password" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.demo.app.model.User</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean
        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.Exception">Error</prop>
            </props>
        </property>
    </bean>
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="2097152" />
    </bean>
</beans>

5 个答案:

答案 0 :(得分:3)

您手动管理交易。这是交易经理的任务。 saveUserData应该像:

public User saveUserData(User user) {
    return (User)sessionFactory.getCurrentSession().merge(user);
}

就是这样。 您可能希望使用@Transactional而不是存储库来注释您的服务。

答案 1 :(得分:0)

您的存储库不使用@component注释。你使用

<jpa:repositories base-package="your.package.put.repository"></jpa:repositories>

所以,你已经使用过了

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

答案 2 :(得分:0)

首先,所有的事务和会话都应该由spring容器管理,所以请不要自己管理会话,只需使用现有的会话进行数据库查询。现在,仅针对您的情况,在控制器级别尝试@Transactional注释,如果它可以工作,那么您需要进行一些修改,如下所示。

For web MVC Spring app should @Transactional go on controller or service?

答案 3 :(得分:0)

在服务级别使用@Transactional,当其中一个操作无法正常工作时(例如,更新操作返回0表示失败)抛出新的RuntimeException()。如果其中一个操作失败,则将回滚作为事务一部分的所有其他操作。

答案 4 :(得分:0)

您正尝试同时使用容器管理事务和用户管理事务。尽量一次只使用一个。

删除@Transactional注释或从方法中删除事务语句。