我用过:
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>
我该如何解决问题?
答案 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)