假设我有以下域类及其相应的历史域类,以便自动保存对原始域对象所做的任何更改:
@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
值。我不知道afterInsert
,afterUpdate
和afterDelete
方法之间的区别在哪里。我还尝试在删除的情况下使用beforeDelete
方法,但没有成功。
任何猜测?
编辑:
我现在检查了我是否可以直接在properties
或afterUpdate
内访问afterDelete
。所以我在两个方法的每一个中添加了println this.properties
作为第一行。有趣的是,这适用于afterUpdate
,但不适用于afterDelete
。可能是什么原因?在我的控制器中,我刚刚放了productInstance.delete flush:true
。
第二次编辑:
最有趣的是,在afterDelete
内,我可以检索productName
的值。无论我是仅使用productName
还是this.productName
。因此,对象不是“空的”。无论如何,我不知道为什么properties
地图是NULL
。
我在实际删除println productInstance.properties
之前,已在控制器delete
操作中添加了productInstance
。它有效。有没有人对这种行为有某种解释?
答案 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}}媒体资源。