title: JPA eclipselink: Error while commit: Transaction rolled back because transaction was set to RollbackOnly
body: <p>I am pretty new to <code>JPA</code> and using <code>eclipselink</code> as <code>JPA engine</code> in my Struts 2 project. I am having problems while committing my records as it throws an exception:</p>
  
  <pre><code>javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly.
  </code></pre>
  
  <p>Here is my Action:-</p>
  
  <pre><code>public class CreateTour extends ActionSupport
          implements UserAware, PersistAware {
  
      private Tour tour;
      private List&lt;Integer&gt; noOfPlaces;
      private List&lt;String&gt; country;
      private List&lt;String&gt; city;
      private List&lt;String&gt; hotel;
      private List&lt;String&gt; checkIn;
      private List&lt;String&gt; checkOut;
      private List&lt;String&gt; 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&lt;Integer&gt; getNoOfPlaces() {
          return noOfPlaces;
      }
  
      public void setNoOfPlaces(List&lt;Integer&gt; noOfPlaces) {
          this.noOfPlaces = noOfPlaces;
      }
  
      public List&lt;String&gt; getCountry() {
          return country;
      }
  
      public void setCountry(List&lt;String&gt; country) {
          this.country = country;
      }
  
      public List&lt;String&gt; getCity() {
          return city;
      }
  
      public void setCity(List&lt;String&gt; city) {
          this.city = city;
      }
  
      public List&lt;String&gt; getHotel() {
          return hotel;
      }
  
      public void setHotel(List&lt;String&gt; hotel) {
          this.hotel = hotel;
      }
  
      public List&lt;String&gt; getCheckIn() {
          return checkIn;
      }
  
      public void setCheckIn(List&lt;String&gt; checkIn) {
          this.checkIn = checkIn;
      }
  
      public List&lt;String&gt; getCheckOut() {
          return checkOut;
      }
  
      public void setCheckOut(List&lt;String&gt; checkOut) {
          this.checkOut = checkOut;
      }
  
      public List&lt;String&gt; getPrerequisites() {
          return prerequisites;
      }
  
      public void setPrerequisites(List&lt;String&gt; 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&lt;Category&gt; 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 &lt; tour.getNoOfDays(); i++) {
              Days day = new Days();
              day.setDayNumber(i+1);
              day.setNoOfPlacesCovered(noOfPlaces.get(i));
  
              for (int j = 0; j &lt; 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&lt;Country&gt; 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&lt;City&gt; 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&lt;Hotel&gt; 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;
      }
  }
  </code></pre>
  
  <p>In its <code>save</code> method, I am calling <code>em.getTransaction().commit()</code> getting above stated exception.</p>
  
  <p>Can anybody please tell me whats wrong with EntityManager?</p>
  
  <p>Here is exception stack trace:-</p>
  
  <pre><code>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)
  </code></pre>