Java 已删除的对象将通过级联问题重新保存
我知道在stackoverflow上几乎没有类似的问题,但不幸的是,这对我没有帮助,所以我正在创建自己的问题。 在我的项目中,我有两个实体Java 已删除的对象将通过级联问题重新保存,java,spring,hibernate,Java,Spring,Hibernate,我知道在stackoverflow上几乎没有类似的问题,但不幸的是,这对我没有帮助,所以我正在创建自己的问题。 在我的项目中,我有两个实体Shop和TypeShop,它们都具有急切的初始化TypeShop可能有几个商店 @Entity @Table(name = "shop_types") public class TypeShop { ... @OneToMany(fetch = FetchType.EAGER, mappedBy="typeShop", cascade = C
Shop
和TypeShop
,它们都具有急切的初始化TypeShop
可能有几个商店
@Entity
@Table(name = "shop_types")
public class TypeShop {
...
@OneToMany(fetch = FetchType.EAGER, mappedBy="typeShop", cascade = CascadeType.ALL)
private Set<Shop> shops;
...
}
以下是控制器的代码:
@RequestMapping(value = "/admin/delete/{id}", method = RequestMethod.GET)
public String deleteShop(@PathVariable("id") Integer id) {
try {
shopDAO.delete(id);
} catch (Exception e ) {
return "404";
}
return "redirect:/admin";
}
试图删除shop
我得到的对象org.springframework.dao.InvalidDataAccessApiUsageException:删除的对象将通过级联重新保存(从关联中删除删除的对象)
所以在那之后我修改了我的代码,在删除shop
之前,我将其从父Set集合中删除。
现在看起来是这样的:
@RequestMapping(value = "/admin/delete/{id}", method = RequestMethod.GET)
public String deleteShop(@PathVariable("id") Integer id) {
try {
Shop shop = shopDAO.findById(id);
TypeShop type = shop.getTypeShop();
type.getShops().remove(shop);
typeShopDAO.update(type);
shopDAO.delete(id);
} catch (Exception e ) {
return "404";
}
return "redirect:/admin";
}
但不幸的是,我又遇到了同样的例外。请帮我解决它。提前谢谢 尝试传递shop对象而不是shop id,并将代码移动到ShopService类,它应该在事务中
@Transactional
public void deleteShop(Integer id){
Shop shop = shopDAO.findById(id);
TypeShop type = shop.getTypeShop();
type.getShops().remove(shop);
typeShopDAO.update(type);
shopDAO.delete(shop);
}
您是否尝试删除关联的另一方?(将shop
中的typeShop
设置为空)。shopService.delete(id)不起作用,您必须传递shop对象。试试这个。谢谢,但实际上在我的实际项目中,我使用的是DAO层和服务层,我从DAO类调用方法delete,DAO类接收整数,但在方法内部,我通过这个id找到我的对象,并通过会话将其删除。delete(object),因此,这显然不是另一个事务中的问题,因此hibernate不知道typeshop对象是否已更新。请参见上面的注释,我在这个问题中简化了我的代码,创建了另一个方法,该方法接受shop对象或将整个代码移到shop dao。
@Transactional
public void deleteShop(Integer id){
Shop shop = shopDAO.findById(id);
TypeShop type = shop.getTypeShop();
type.getShops().remove(shop);
typeShopDAO.update(type);
shopDAO.delete(shop);
}