2017-08-04 11 views
1

@Transactionalがspring mvcで動作していません。私が削除したとします @Transactional注釈データはRepositoryClassに到達しました。 Throwable targetException - org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(Object ...) 私はリポジトリクラスにデータを到達する必要があります。@Transactionalがspring mvcで動作しない

お手数ですが、 ありがとうございます。

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> 

答えて

3

トランザクションを手動で管理しています。それがトランザクションマネージャの仕事です。 saveUserDataは次のようになります。

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

これだけです。 そしておそらくあなたのサービスに@Transactionalと注釈をつけ、リポジトリではないと思うでしょう。

+0

私はリポジトリを使用しますが – umapathi

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> 
+0

代わりの構成要素)がThrowableをjava.lang.reflect.InvocationTargetException.getTargetException(なって機能していない、あなたのreplay.butをありがとう:リポジトリのベースパッケージ= "your.package.put.repository"> umapathi

+0

を解決していないあなたは、JPA <説明できるよ – umapathi

+0

申し訳ありません。あなたはそれを検索することができます。 – Byeon0gam

0

ファーストを使用して、セッションが良い習慣はそう自分自身でセッションを管理しないでくださいされたスプリングコンテナによって管理される必要があります使用しますデータベースクエリのための既存のセッション。あなたの状況に合わせて、コントローラーレベルで@Transactionalアノテーションを試してください。それが機能する場合は、下記のようにいくつかの変更が必要です。

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

0

使用@Transactionalサービスレベルで、それは(例えば、更新操作は、それが失敗したことを意味する0を返す)(新規のRuntimeExceptionを投げる)必要としてのいずれかの操作が作業をdoesntの。いずれかの操作が失敗すると、トランザクションの一部である他のすべての操作がロールバックされます。

0

コンテナ管理トランザクションとユーザー管理トランザクションの両方を同時に使用しようとしています。一度に1つだけを使用してください。

@Transactionalアノテーションを削除するか、メソッドからトランザクションステートメントを削除してください。

関連する問題