1

I have used:

spring mvc-version:4.3.7 postgres:9.5 Tool:STS

I want to update my database. But after entry in the form , when I click submit button- it is shown:

Request processing failed; nested exception is org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException: Object of class [com.asha.farmvill.model.Division] with identifier [0]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.asha.farmvill.model.Division#0]

this is my controller:

@RequestMapping("/edit/{id}")
    public String editDivision(@PathVariable("id") int id, Model model) {
        model.addAttribute("division", this.divisionService.getdivisionById(id));
        return "editdivision";
    }

    @PostMapping(value="/updatedivision")
     public String updateEmployee(@ModelAttribute("division")Division division, ModelMap model) {

        this.divisionService.updatedivision(division);
                return "divisionlist";
    }

The DAO is given below:

 public void updatedivision(Division p) {
        Session session = this.sessionFactory.getCurrentSession();
        session.update(p);

        System.out.println("Division updated successfully, Division Details=" + p.getName());

    }

This is my servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.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.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing 
        infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
        up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
        in the /WEB-INF/views directory -->
    <beans:bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <beans:property name="driverClassName" value="org.postgresql.Driver" />
        <beans:property name="url"
            value="jdbc:postgresql://localhost:5432/firmvilldb" />
        <beans:property name="username" value="postgres" />
        <beans:property name="password" value="root" />
    </beans:bean>

    <!-- Hibernate 4 SessionFactory Bean definition -->
    <beans:bean id="hibernate5AnnotatedSessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="annotatedClasses">
            <beans:list>
                <beans:value>com.asha.farmvill.model.Division</beans:value>
            </beans:list>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect
                </beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>

   <beans:bean id="divisionDao" class="com.asha.farmvill.dao.DivisionDaoImp">
        <beans:property name="sessionFactory" ref="hibernate5AnnotatedSessionFactory" />
    </beans:bean>
    <beans:bean id="divisionService" class="com.asha.farmvill.service.DivisionServiceImp">
        <beans:property name="divisionDao" ref="divisionDao"></beans:property>
    </beans:bean>
    <context:component-scan base-package="com.asha.farmvill" />

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <beans:bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <beans:property name="sessionFactory" ref="hibernate5AnnotatedSessionFactory" />
    </beans:bean>
</beans:beans>

How can I solve the problem?

OUN Saif
  • 305
  • 1
  • 4
  • 20

1 Answers1

0

Add @Transactional annotation on top of the method like below.

@Transactional
public void updatedivision(Division p) {
     Session session = this.sessionFactory.getCurrentSession();
     session.update(p);
     System.out.println("Division updated successfully, Division Details=" + p.getName());
}

Refer Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

Alien
  • 15,141
  • 6
  • 37
  • 57
  • I have connected the controller with service and transactional is already added there. And I tried it before. but it doesn't work – OUN Saif Oct 23 '18 at 19:48