目标表未正确更新

时间:2018-10-23 18:07:12

标签: postgresql hibernate spring-mvc jsp

我用过:

  

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

我想更新我的数据库。但是在表单中输入后,当我单击“提交”按钮时,它会显示:

  

请求处理失败;嵌套异常为   org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException:   带有标识符的类[com.asha.farmvill.model.Division]的对象   [0]:乐观锁定失败;嵌套异常为   org.hibernate.StaleObjectStateException:行已由更新或删除   另一笔交易(或未保存的值映射不正确):   [com.asha.farmvill.model.Division#0]

这是我的控制者:

@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";
    }

DAO如下:

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

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

    }

这是我的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>

我该如何解决问题?

1 个答案:

答案 0 :(得分:0)

在如下所示的方法顶部添加@Transactional注释。

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

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