[SPRING] Spring JPA 트랜잭션 진행 중
SPRINGSpring JPA 트랜잭션 진행 중
나는 봄과 JPA에 익숙하지 않아 5 일을 낭비했고 인터넷 검색으로는 아무런 결과도 얻지 못했습니다. SQL SERVER에 개체를 저장하고 싶습니다. 연결은 정확하지만 .flush ()를 쓸 때 예외가 발생합니다.
이것은 내 jpaContext.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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<context:annotation-config />
<context:component-scan base-package="com.misha.service"/>
<context:component-scan base-package="com.misha.repository"/>
<context:component-scan base-package="com.misha.model"/>
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="myEntityManager"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.misha.model"/>
<property name="persistenceUnitName" value="test" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
<property name="url"
value="jdbc:jtds:sqlserver://127.0.0.1;instance=SQLEXPRESS;DatabaseName=misha" />
<property name="username" value="sa" />
<property name="password" value="root" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEntityManager" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
이것은 내 persistence.xml 파일입니다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="test" >
<class>com.misha.model.Table1</class>
</persistence-unit>
</persistence>
이것은 내 서비스 구현입니다.
@Service("manService")
public class SaveManImpl implements SaveMan {
//
@Autowired
private ManRepositoryImpl manRepo;
@Transactional
public Table1 save(Table1 table) {
manRepo.save(table);
return null;
}
}
마지막으로 저장소 구현 :
@Repository("manRepository")
public class ManRepositoryImpl implements ManRepository {
@PersistenceContext
private EntityManager em;
public Table1 save(Table1 table){
em.persist(table);
em.flush();
return table;
}
}
예외적으로 Spring Cant는 @Transactional annotation을 볼 수 있습니다. 주석 저장을 위의 저장 메소드 위에 올려 놓으려고했는데 아무런 결과도 없었습니다. 미리 감사드립니다.
내 컨트롤러에서 save 메서드를 호출합니다.
package com.misha.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import com.misha.model.Table1;
import com.misha.service.SaveMan;
@Controller
public class ManController {
@Autowired
SaveMan saveMan; // this is service interface
@RequestMapping(value="/test1")
public String saveMan(){
Table1 tab = new Table1();
tab.setName("name");
saveMan.save(tab);
return "saveMan";
}
}
오류 스택 :
SEVERE: Servlet.service() for servlet [fitTrackerServlet] in context with path [/test] threw exception [Request processing failed; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress] with root cause
javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
at com.sun.proxy.$Proxy20.flush(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at com.sun.proxy.$Proxy20.flush(Unknown Source)
at com.misha.repository.ManRepositoryImpl.save(ManRepositoryImpl.java:21)
at com.misha.service.SaveManImpl.save(SaveManImpl.java:19)
at com.misha.controllers.ManController.saveMan(ManController.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Spring 설정 파일
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<mvc:annotation-driven />
<!--<mvc:resources location="pdfs" mapping="/pdfs/**" />
<mvc:resources location="/resources" mapping="/resources/**"/> -->
<context:component-scan base-package="com.misha.controllers"></context:component-scan>
<context:component-scan base-package="com.misha.repository" />
<context:component-scan base-package="com.misha.service" />
<context:annotation-config/>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<property name="order" value="0"></property>
</bean>
<bean id="contentNegotiatingViewResolver"
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
<entry key="request" value="text/html" />
</map>
</property>
<property name="favorPathExtension" value="false" />
<property name="favorParameter" value="true" />
<property name="defaultViews">
<list>
</list>
</property>
</bean>
<bean class="org.springframework.context.support.ResourceBundleMessageSource" >
<property name="basename" value="WEB-INF/messages"></property>
</bean>
</beans>
해결법
-
==============================
1.두 개의 Spring 컨텍스트가 있습니다.
두 개의 Spring 컨텍스트가 있습니다.
문제는이 하위 컨텍스트에서 서비스 및 저장소 패키지도 검사한다는 것입니다. 따라서 각 서비스와 저장소의 두 인스턴스로 끝납니다.
따라서 컨트롤러에는 컨트롤러와 동일한 컨텍스트 (트랜잭션이 아닌 컨텍스트)에서 오는 서비스가 주입됩니다.
이를 확인하기 위해 빈의 생성자에 흔적을 추가하고 인스턴스화 된 횟수를 확인할 수 있습니다.
그리고이 문제를 피하기 위해 두 가지 해결책이 있습니다.
-
==============================
2.엔티티 관리자를 트랜잭션 관리자에 소개해야하므로 @Transactionalit을 사용하여 함수에 주석을 추가하면 풀에서 인스턴스가로드됩니다.
엔티티 관리자를 트랜잭션 관리자에 소개해야하므로 @Transactionalit을 사용하여 함수에 주석을 추가하면 풀에서 인스턴스가로드됩니다.
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="myEmf" /> </bean> <tx:annotation-driven />
HTH!
-
==============================
3.이야기를 짧게 만들려면 메서드 시작 부분에 @Transactional을 추가하십시오. 제 경우에는 그게 문제였습니다.
이야기를 짧게 만들려면 메서드 시작 부분에 @Transactional을 추가하십시오. 제 경우에는 그게 문제였습니다.
from https://stackoverflow.com/questions/28950134/spring-jpa-no-transaction-is-in-progress by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring MySQL과 RowCallbackHandler를 사용하여 큰 데이터 세트를 관리하는 방법 (0) | 2019.02.14 |
---|---|
[SPRING] 봄 부팅으로 WAR 파일에서 JSP 페이지 찾기 (0) | 2019.02.14 |
[SPRING] Spring + Jersey 트랜잭션 주석 (0) | 2019.02.14 |
[SPRING] Spring 보안으로 성공적으로 로그인 한 후 로그인 날짜를 올바르게 업데이트하는 방법은 무엇입니까? (0) | 2019.02.14 |
[SPRING] Spring - 처리 후 모든 요청에 대한 헤더 수정 (postHandle에서) (0) | 2019.02.14 |