批量更新从更新返回了意外的行数(Spring/Hibernate)
Posted
技术标签:
【中文标题】批量更新从更新返回了意外的行数(Spring/Hibernate)【英文标题】:Batch update returned unexpected row count from update (Spring/Hibernate) 【发布时间】:2016-07-17 15:18:19 【问题描述】:现在我的数据库中有 3 个表 - Booking、Restaurant 和 RestaurantTable。我在 Restaurant 和 RestaurantTable 之间有一个一对多的映射(一个餐厅可以有很多张桌子,但一张桌子只能有一个餐厅)。我有一个名为“newTable.jsp”的文件,可以将新桌子插入餐厅。但是当我尝试这样做时,它给了我以下错误:
Request processing failed; nested exception is org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
我认为它正在尝试访问尚不存在的 RestaurantTable?但我不知道如何解决。
这是我的“Restaurant.java”类:
@Entity
@Table(name="restaurant")
public class Restaurant
@Id
@Column(name="id")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@Column(name="restaurant_name")
private String restaurantName;
@Column(name="address")
private String address;
@OneToMany(mappedBy="restaurant", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<RestaurantTable> table;
// Getters and setters
我的“RestaurantTable.java”:
@Entity
@Table(name="restaurant_table")
public class RestaurantTable
@Id
@Column(name="id")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@Column(name="table_size")
private int tableSize;
@Column(name="table_number")
private int tableNumber;
@ManyToOne
@JoinColumn(name="restaurant_id")
private Restaurant restaurant;
// Getters and setters
我的“newTable.jsp”
<body>
<jsp:include page="../fragments/menu.jsp"/>
<div id="body">
<section class="content-wrapper main-content clear-fix">
<h2>Add New Table</h2>
<form:form method="POST" commandName="table" modelAttribute="table">
<table>
<tr>
<td>Table size:</td>
<td><form:input path="tableSize" /></td>
</tr>
<tr>
<td>Table number:</td>
<td><form:input path="tableNumber" /></td>
</tr>
<tr>
<td colspan="3"><input type="submit" />
</td>
</tr>
</table>
</form:form>
</section>
</div>
<jsp:include page="../fragments/footer.jsp"/>
</body>
我的 RestaurantTableController:
@Controller
public class RestaurantTableController
@Autowired
private RestaurantService restaurantService;
@Autowired
private RestaurantTableService restaurantTableService;
@RequestMapping(value="restaurant/table/id", method = RequestMethod.GET)
public String addRestaurantTable(Model model)
model.addAttribute("table", new RestaurantTable());
return "newTable";
@RequestMapping(value = "restaurant/table/id", method = RequestMethod.POST)
public String addRestaurantTable(@PathVariable Long id, @ModelAttribute ("table") RestaurantTable table)
// Get a Restaurant object and add the table to it.
Restaurant restaurant = restaurantService.getRestaurant(id);
Set<RestaurantTable> tableSet = restaurant.getTable();
tableSet.add(table);
restaurant.setTable(tableSet);
restaurantService.updateRestaurant(restaurant);
return "editRestaurant";
RestaurantTableController 中的 id 是一个餐厅 id,它是从“editRestaurant.jsp”传递过来的。任何帮助表示赞赏。
编辑:我的 updateRestaurant 方法:
@Override
public void updateRestaurant(Restaurant restaurant)
Session session = this.sessionFactory.getCurrentSession();
session.update(restaurant);
logger.info("Restaurant record updated successfully, Restaurant Details=" + restaurant);
【问题讨论】:
请显示 updateRestaurant 方法 @itpr 我编辑了我的帖子。感谢您的帮助! 【参考方案1】:RestaurantTable
实体当时没有ID,所以hibernate会抛出异常。尝试使用merge
方法而不是update
update
使用给定分离实例的标识符更新持久实例。如果存在具有相同标识符的持久化实例,则抛出异常。
【讨论】:
以上是关于批量更新从更新返回了意外的行数(Spring/Hibernate)的主要内容,如果未能解决你的问题,请参考以下文章
HIbernate“StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1”
org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期的
org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1
org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1
org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1
Session.flush() 导致 org.hibernate.StaleStateException:批量更新从更新返回了意外的行数:1 实际行数:0 预期:1