grails - afterDelete()访问域属性

时间:2014-12-22 12:52:43

标签: grails properties grails-domain-class

假设我有以下域类及其相应的历史域类,以便自动保存对原始域对象所做的任何更改:

@Entity
class Product {

    String productName 

    static constraints = {
        productName maxSize: 250
    }

    def afterInsert() {
        History_Product hist = new History_Product(this)
        hist.insertType = 'I'
        History_Product.withNewSession {
            hist.save()
        }
    }

    def afterUpdate() {
        History_Product hist = new History_Product(this)
        hist.insertType = 'U'
        History_Product.withNewSession {
            hist.save()
        }
    }

    def afterDelete() {
        History_Product hist = new History_Product(this)
        hist.insertType = 'D'
        History_Product.withNewSession {
            hist.save()
        }
    }
}

@Entity
class History_Product {

    String productName
    Char insertType

    static constraints = {
        productName nullable: true, maxSize: 250
    }

    History_Product() {}

    History_Product(Product p) {
        this.properties = p.properties
    }
}

因此,每次创建,更新或删除Product对象时,都会创建一个新的History_Product以保存旧值。这就像创建和更新的魅力。但是,如果我想要删除某个产品,则该功能无效,因为p.properties History_Product的第二个构造函数仅包含NULL值。我不知道afterInsertafterUpdateafterDelete方法之间的区别在哪里。我还尝试在删除的情况下使用beforeDelete方法,但没有成功。

任何猜测?

编辑:

我现在检查了我是否可以直接在propertiesafterUpdate内访问afterDelete。所以我在两个方法的每一个中添加了println this.properties作为第一行。有趣的是,这适用于afterUpdate,但不适用于afterDelete。可能是什么原因?在我的控制器中,我刚刚放了productInstance.delete flush:true

第二次编辑:

最有趣的是,在afterDelete内,我可以检索productName的值。无论我是仅使用productName还是this.productName。因此,对象不是“空的”。无论如何,我不知道为什么properties地图是NULL

第三次编辑:

我在实际删除println productInstance.properties之前,已在控制器delete操作中添加了productInstance。它有效。有没有人对这种行为有某种解释?

1 个答案:

答案 0 :(得分:0)

我得请你原谅。我隐瞒了一些显然对问题的解决方案至关重要的信息 - 我没想到它很重要。所以这就是我最终发现的:

我的班级Product与另一个名为ProductDetail的班级有一对多的关系。因此,Product static hasMany = [productDetails:ProductDetail] ProductDetail@Entity class ProductDetail { Product product } 域类与此类似:

static belongsTo=[product:Product]

我不记得为什么但显然我忘了放Product product而不是上面写的properties行。

最终,更改该单行解决了我的问题,最后我可以访问Product对象的ProductDetail

顺便说一句,如果存在belongsTo对象则无关紧要。如果遗漏了properties,则无法访问Product方的{{1}}媒体资源。