2014-02-12 65 views
2

我對JPA相當陌生,在我的Struts 2項目中使用eclipselink作爲​​。我有而我的承諾作爲記錄它拋出一個異常問題:JPA eclipselink:錯誤,同時提交:事務回滾,因爲事務設置爲RollbackOnly

javax.persistence.RollbackException: Transaction rolled back because transaction was set to 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; 
    } 
} 

在其save方法,我打電話em.getTransaction().commit()越來越聲明例外以上。

任何人都可以告訴我什麼是錯誤的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恕我直言:糟糕的架構(混合持久對象與域邏輯) –

+0

嘿@AndreiI,在這種情況下,除了使用類似'spring-JPA-hibernate'集成的東西來改善它的拱門之外,我沒有別的選擇。但是,我在我的開發環境中運行這個應用程序。這不能是一個併發相關的問題,對嗎? –

回答

0

使用此上方的save方法:

@Transactional(noRollbackFor = Exception.class) 
+0

此屬性與JPA有關嗎?或者,這是一個春天的詮釋?你能引用這個註釋的全名(連同包)嗎? –

+0

這是一個Spring註釋。文檔如下:http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/transaction/annotation/Transactional.html?is-external=true – rsb2097