Grails 使用afterInsert()修改域后是否需要双重保存()?
我有一个域类,它在Grails 使用afterInsert()修改域后是否需要双重保存()?,grails,gorm,Grails,Gorm,我有一个域类,它在afterInsert事件中修改它的一个属性 一个小例子: class Transaction { Long transactionId static constraints = { transactionId nullable: true } def afterInsert() { // copy the record id to transactionId; transactionId = id }
afterInsert
事件中修改它的一个属性
一个小例子:
class Transaction {
Long transactionId
static constraints = {
transactionId nullable: true
}
def afterInsert() {
// copy the record id to transactionId;
transactionId = id
}
}
每当我在中保存域对象时(transaction.save(flush:true)
)
我的单元测试一切正常,并且更新了事务ID
。但是当我尝试使用Transaction.findByTransactionId()
查找保存的记录时,我没有得到任何结果:
// do something
transaction.save(flush: true)
Transaction transaction = Transaction.findByTransactionId(1)
// !! no results; transaction == null
在使用findByTransactionId()
找到记录之前,我必须执行两次save()
:
双重save()
似乎很尴尬。有没有关于如何消除对它的需要的建议?如果验证通过,调用将返回持久化实体,因此没有任何理由在以后单独查找它。我认为您的问题在于,您正在实例化事务
变量(使用相同的名称)。如果你一定要查(我不建议这样做),那就换个名字吧。此外,如果列是自动递增的,则您正在查找的1
id可能不存在
def a = a.save(flush: true)
a?.refresh() // for afterInsert()
Transaction b = (a == null) ? null : Transaction.findByTransactionId(a.id)
// (Why look it up? You already have it.)
更新:
// do something
transaction.save(flush: true)
Transaction transaction = Transaction.findByTransactionId(1)
// !! no results; transaction == null
由于您使用的是afterInsert()
,Hibernate可能没有意识到需要刷新对象。在调用save()
后尝试使用。如果验证通过,则对的调用将返回持久化实体,因此没有任何理由在以后单独查找它。我认为您的问题在于,您正在实例化事务
变量(使用相同的名称)。如果你一定要查(我不建议这样做),那就换个名字吧。此外,如果列是自动递增的,则您正在查找的1
id可能不存在
def a = a.save(flush: true)
a?.refresh() // for afterInsert()
Transaction b = (a == null) ? null : Transaction.findByTransactionId(a.id)
// (Why look it up? You already have it.)
更新:
// do something
transaction.save(flush: true)
Transaction transaction = Transaction.findByTransactionId(1)
// !! no results; transaction == null
由于您使用的是
afterInsert()
,Hibernate可能没有意识到需要刷新对象。调用save()
后尝试使用这段代码显然可以工作:
def afterInsert() {
transactionId = id
save() // we need to call save to persist the changens made to the object
}
因此,需要在afterInsert中调用save来持久化在afterInsert中所做的更改 这一小段代码显然能让它工作:
def afterInsert() {
transactionId = id
save() // we need to call save to persist the changens made to the object
}
因此,需要在afterInsert中调用save来持久化在afterInsert中所做的更改 您应该检查保存中是否有错误。如果(!transaction.save()){}请参阅以了解有关此操作的详细信息。保存操作不会给我错误,我忽略了该代码。您能帮我尝试一下吗?你能把
断言为空吗!=id
在您的afterInsert中?我添加了建议的代码'assert null!=这没有什么区别。id被很好地填充,因此断言是正确的!您应该检查保存中是否有错误。如果(!transaction.save()){}请参阅以了解有关此操作的详细信息。保存操作不会给我错误,我忽略了该代码。您能帮我尝试一下吗?你能把断言为空吗!=id
在您的afterInsert中?我添加了建议的代码'assert null!=这没有什么区别。id被很好地填充,因此断言是正确的!该代码用于测试目的,在我的实际代码中,我保留了工作完美的事务。然后,稍后我将看到另一段代码,我想根据afterInsert中设置的值查找事务。那么无论我做什么,都找不到记录。在afterInsert中设置的值不会持久化。所以这就是为什么我需要一个双重保存。我按照你的建议做了另一个完全不同的变量。这没有效果。我确实在服务中设置了断点,并执行了以下步骤。。1) Transaction.list(),返回带有变量的事务列表。我检查了事务并尝试了findBy result==null。在afterInsert和voila中未设置的字段上查找相同的字段。。他们被发现了。。因此,无论我在afterInsert中设置了什么字段,我都无法在该字段上使用findBy。在运行时检查对象表明字段已正确填充。所以我不知道在哪里搜索..思考之后,我更新了我的答案。保存后尝试刷新方法。我修改了代码,这也没什么区别。在afterInsert中更改属性时,使用refresh会导致丢失这些更改。这段代码显然可以正常工作:def afterInsert(){transactionId=id save()}因此需要在afterInsert中调用save来持久化在afterInsert中所做的更改代码用于测试,在我的实际代码中,我坚持完美的交易。然后,稍后我将看到另一段代码,我想根据afterInsert中设置的值查找事务。那么无论我做什么,都找不到记录。在afterInsert中设置的值不会持久化。所以这就是为什么我需要一个双重保存。我按照你的建议做了另一个完全不同的变量。这没有效果。我确实在服务中设置了断点,并执行了以下步骤。。1) Transaction.list(),返回带有变量的事务列表。我检查了事务并尝试了findBy result==null。在afterInsert和voila中未设置的字段上查找相同的字段。。他们被发现了。。因此,无论我在afterInsert中设置了什么字段,我都无法在该字段上使用findBy。在运行时检查对象表明字段已正确填充。所以我不知道在哪里搜索..思考之后,我更新了我的答案。保存后尝试刷新方法。我修改了代码,这也没什么区别。在afterInsert中更改属性时,使用refresh会导致丢失这些更改。这段代码显然可以正常工作:def afterInsert(){transactionId=id save()},因此需要在afterInsert中调用save来持久化在afterInsert中所做的更改,这样可以避免使用此代码来保存