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中所做的更改,这样可以避免使用此代码来保存