groovy 我在Grails中遇到完整性违规异常,如何在Grails中级联删除相关实体?

vdzxcuhz  于 2022-11-01  发布在  其他
关注(0)|答案(2)|浏览(169)

我有一个简单的电子商务Grails 5应用程序,在其中我将CartItem定义为:

class CartItem {
Customer customer
Product product
Integer quantity}

我的产品类别:

class Product {
String name
Double price }

删除产品时,必须同时删除包含此产品的cartItem(如果有)。(这同样适用于客户)。现在,当我删除产品时,如果此产品包含cartItem,则会出现完整性违规异常。
我正在使用Hibernate和H2内存数据库。如果不使用Hibernate配置(除非这是唯一的方法),我如何使用grails GORM实现产品删除级联到关联cartItem删除行为的自动删除?
当客户将产品添加到购物车时,将创建CartItem的示例。
当cartItem被删除时(当产品从购物车中删除时),相关的产品或客户不会发生任何变化。但是当产品被删除时,其关联的cartItem也必须被删除。

rks48beu

rks48beu1#

CartItem不属于Product,因此在删除Product时Grails无法删除它,但是可以利用Grails域类事件-“beforeDelete”。
https://docs.grails.org/3.0.x/guide/GORM.html#eventsAutoTimestamping

eqfvzcg8

eqfvzcg82#

您不能删除此配置中的产品。这是Grails文档。
https://docs.grails.org/5.0.0-RC4/ref/Database%20Mapping/cascade.html
该文档显示了带有hasMany引用的示例。

class Author {
    static hasMany = [books: Book]
    static mapping = {
        books cascade: 'all-delete-orphan'
    }
}

在我看来,您还需要在CartItem类中包含hasMany,这样才能运行,请查看Grails文档中的示例。
您可以尝试将此行添加到CartItem类中,以查看是否存在任何错误,说明无法找到产品参考。

static mapping = {
        product cascade: 'all-delete-orphan'
}

我以前没有试过,所以我不能直接给予你。
如果这不起作用,你将不得不滚动你自己的。你也可以从数据库中修改FK索引以启用级联删除。确保你记录你所做的。否则下一个拿起项目的家伙会抱怨。

相关问题