JPA eclipselink:提交时出错:事务已回滚,因为事务已设置为RollbackOnly

时间:2014-02-12 04:10:49

标签: java jpa eclipselink

我是JPA的新手,并且在我的Struts 2项目中使用eclipselink作为JPA engine。我在提交记录时遇到问题,因为它会引发异常:

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)

1 个答案:

答案 0 :(得分:0)

save方法上方使用此项:

@Transactional(noRollbackFor = Exception.class)