2014-02-12 2 views
2

저는 JPA으로 새롭고 eclipselinkJPA engine으로 Struts 2 프로젝트에서 사용하고 있습니다. 그 save 방법에서JPA eclipselink : 커밋 중 오류 : 트랜잭션이 RollbackOnly로 설정되어 트랜잭션이 롤백되었습니다.

public class CreateTour extends ActionSupport 
     implements UserAware, PersistAware { 

    private Tour tour; 
    private List<Integer> noOfPlaces; 
    private List<String> country; 
    private List<String> city; 
    private List<String> hotel; 
    private List<String> checkIn; 
    private List<String> checkOut; 
    private List<String> prerequisites; 
    private String categoryName; 

    private UserInfo user; 
    private EntityManager em; 

    public String getCategoryName() { 
     return categoryName; 
    } 

    public void setCategoryName(String categoryName) { 
     this.categoryName = categoryName; 
    } 

    public Tour getTour() { 
     return tour; 
    } 

    public void setTour(Tour tour) { 
     this.tour = tour; 
    } 

    public List<Integer> getNoOfPlaces() { 
     return noOfPlaces; 
    } 

    public void setNoOfPlaces(List<Integer> noOfPlaces) { 
     this.noOfPlaces = noOfPlaces; 
    } 

    public List<String> getCountry() { 
     return country; 
    } 

    public void setCountry(List<String> country) { 
     this.country = country; 
    } 

    public List<String> getCity() { 
     return city; 
    } 

    public void setCity(List<String> city) { 
     this.city = city; 
    } 

    public List<String> getHotel() { 
     return hotel; 
    } 

    public void setHotel(List<String> hotel) { 
     this.hotel = hotel; 
    } 

    public List<String> getCheckIn() { 
     return checkIn; 
    } 

    public void setCheckIn(List<String> checkIn) { 
     this.checkIn = checkIn; 
    } 

    public List<String> getCheckOut() { 
     return checkOut; 
    } 

    public void setCheckOut(List<String> checkOut) { 
     this.checkOut = checkOut; 
    } 

    public List<String> getPrerequisites() { 
     return prerequisites; 
    } 

    public void setPrerequisites(List<String> prerequisites) { 
     this.prerequisites = prerequisites; 
    } 

    @Override 
    public String execute() { 
     return INPUT; 
    } 

    public String save() { 
     em.getTransaction().begin(); 

     tour.setCreationTime(new Date(System.currentTimeMillis())); 

     //Check Category 
     TypedQuery<Category> queryCat = em.createQuery("select c from Category c where c.categoryName = :catName", Category.class); 
     queryCat.setParameter("catName", categoryName); 
     Category catEntered; 

     try { 
      catEntered = queryCat.getSingleResult(); 
     } catch (NoResultException noResult) { 
      catEntered = new Category(); 
      catEntered.setCategoryName(categoryName); 
      catEntered.setCreationTime(new Date(System.currentTimeMillis())); 
      em.persist(catEntered); 
     } 

     tour.setCategory(catEntered); 
     catEntered.getTourList().add(tour); 

     addDaysToTour(tour); 

     em.persist(tour); 

     em.getTransaction().commit(); 

     addActionMessage("Tour created successfully"); 

     return INPUT; 
    } 

    private void addDaysToTour(Tour tour) { 
     int placesCounter = 0; 

     for (int i = 0; i < tour.getNoOfDays(); i++) { 
      Days day = new Days(); 
      day.setDayNumber(i+1); 
      day.setNoOfPlacesCovered(noOfPlaces.get(i)); 

      for (int j = 0; j < day.getNoOfPlacesCovered(); j++) { 
       addCityToDay(day, country.get(j + placesCounter), city.get(j + placesCounter)); 
      } 

      day.setPrerequisites(prerequisites.get(i)); 

      addHotelToDay(day, hotel.get(i), day.getCityList().get(day.getCityList().size()-1)); 

      tour.getDaysList().add(day); 
      day.setTour(tour); 

      em.persist(day); 

      placesCounter += day.getNoOfPlacesCovered(); 
     } 
    } 

    private void addCityToDay(Days day, String countryName, String cityName) { 
     //Check and Add Country 
     TypedQuery<Country> queryCountry = em.createQuery("select c from Country c " 
       + "where c.countryName = :countryName", Country.class); 
     queryCountry.setParameter("countryName", countryName); 
     Country inputCountry; 

     try { 
      inputCountry = queryCountry.getSingleResult(); 
     } catch (NoResultException noResult) { 
      inputCountry = new Country(); 
      inputCountry.setCountryName(countryName); 
      inputCountry.setCreationTime(new Date(System.currentTimeMillis())); 
      em.persist(inputCountry); 
     } 

     //Check and Add City 
     TypedQuery<City> queryCity = em.createQuery("select c from City c " 
       + "where c.cityName = :cityName and c.country.countryId = :countryId", City.class); 
     queryCity.setParameter("cityName", cityName); 
     queryCity.setParameter("countryId", inputCountry.getCountryId()); 
     City inputCity; 

     try { 
      inputCity = queryCity.getSingleResult(); 
     } catch (NoResultException noResult) { 
      inputCity = new City(); 
      inputCity.setCityName(cityName); 
      inputCity.setCountry(inputCountry); 
      inputCity.setCreationTime(new Date(System.currentTimeMillis())); 

      inputCountry.getCityList().add(inputCity); 
      em.persist(inputCity); 
     } 

     inputCity.getDaysList().add(day); 
     day.getCityList().add(inputCity); 
    } 

    private void addHotelToDay(Days day, String hotelName, City city) { 
     //Check Category 
     TypedQuery<Hotel> queryHotel = em.createQuery("select h from Hotel h " 
       + "where h.hotelName = :hotelName and " 
       + "h.city.cityId = :cityId", Hotel.class); 
     queryHotel.setParameter("hotelName", hotelName); 
     queryHotel.setParameter("cityId", city.getCityId()); 
     Hotel inputHotel; 

     try { 
      inputHotel = queryHotel.getSingleResult(); 
     } catch (NoResultException noResult) { 
      inputHotel = new Hotel(); 
      inputHotel.setHotelName(categoryName); 
      inputHotel.setCity(city); 
      inputHotel.setCreationTime(new Date(System.currentTimeMillis())); 

      city.getHotelList().add(inputHotel); 
      em.persist(inputHotel); 
     } catch (IllegalStateException ise) { 
      inputHotel = new Hotel(); 
      inputHotel.setHotelName(categoryName); 
      inputHotel.setCity(city); 
      inputHotel.setCreationTime(new Date(System.currentTimeMillis())); 

      city.getHotelList().add(inputHotel); 
      em.persist(inputHotel); 
     } 

     HotelDetails hotelDetails = new HotelDetails(); 
     hotelDetails.setCheckIn(checkIn.get(day.getDayNumber())); 
     hotelDetails.setCheckOut(checkOut.get(day.getDayNumber())); 
     hotelDetails.setDay(day); 
     hotelDetails.setHotel(inputHotel); 

     inputHotel.getHotelDetailsList().add(hotelDetails); 
     day.getHoteldetailsList().add(hotelDetails); 

     em.persist(hotelDetails); 
    } 

    public void setUser(UserInfo user) { 
     this.user = user; 
    } 

    public void setEntityManager(EntityManager em) { 
     this.em = em; 
    } 
} 

, 내가 언급 한 예외 위에 점점 em.getTransaction().commit()를 호출하고 -이 : 여기

javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly. 

내 작업은 다음과 같습니다 예외를 throw로 내 기록을 짓는 동안은 문제가 발생하고있다.

아무도 나에게 EntityManager의 문제점을 말해 줄 수 있습니까? 여기

는 예외 스택 추적입니다 : -

javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly. 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:141) 
    at com.ankitsoft.actions.admin.CreateTour.save(CreateTour.java:143) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252) 
    at org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265) 
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.ankitsoft.interceptor.PersistenceInterceptor.intercept(PersistenceInterceptor.java:46) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at com.ankitsoft.interceptor.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:43) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) 
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562) 
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter.doFilter(StrutsExecuteFilter.java:93) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter.doFilter(StrutsPrepareFilter.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.f 
INFO: ilterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 
    at java.lang.Thread.run(Thread.java:744) 
+0

인쇄, 그것은 롤백을 일으키는 오류를 포장한다로 - 인쇄 내부 오류가 더 의미있는 메시지를 제공해야합니다. – Chris

+0

EM이 다른 동시 스레드에서 사용되지 않는다는 것을 어떻게 보장합니까? PS IMHO : 잘못된 아키텍처 (영구적 인 객체를 도메인 로직과 섞음) –

+0

Hey @AndreiI,이 경우, 나는 그것의 아치를 향상시키기 위해'spring-JPA-hibernate' 통합과 같은 것을 사용하는 것 외에 다른 옵션을 가지고 있지 않다. 하지만, 내 dev에 env 에서이 응용 프로그램을 실행하고 있습니다. 동시성 관련 문제 일 수는 없습니다. –

답변

0

사용이 당신의 save 방법 위 :

전체 예외 스택 추적 오프
@Transactional(noRollbackFor = Exception.class) 
+0

이 속성은 JPA와 관련이 있습니까? 아니면 스프링 주석입니까? 이 주석의 전체 이름을 패키지와 함께 인용 할 수 있습니까? –

+0

그것은 스프링 주석입니다. 문서는 다음과 같습니다. http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/transaction/annotation/Transactional.html?is-external=true – rsb2097

관련 문제