Java 已删除的对象将通过级联问题重新保存

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

我知道在stackoverflow上几乎没有类似的问题,但不幸的是,这对我没有帮助,所以我正在创建自己的问题。 在我的项目中,我有两个实体
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);
    }