如何测试实例是否在GORM数据库中保留?

时间:2014-07-28 13:23:12

标签: grails gorm grails-domain-class

当我将实例保存为:

test.save() 

保存可能会失败。我能做到

if (!test.save(flush:true) {
  // save failed
} 

考虑一下我从另一个函数获取实例并且无法执行此检查的情况,因为我不会再次保存实例。

有没有办法检查实例是否仍然存在于数据库中或是否具有未保存的状态?

3 个答案:

答案 0 :(得分:4)

我知道这是一个老问题,但为了将来的参考,我认为适当的答案是:

鉴于OP的原始问题

  

有没有办法检查实例是否仍然存在于数据库中或是否具有未保存的状态?

是的,有。调用实例的域类的exists()方法。

假设我们有一个 Test 域类和一个 test 对象实例:

def bPersists = (  test.id != null  &&  Test.exists(test.id)  ); // Check test.id for null because a id of zero is a valid index, also the id might not be an integer.

请注意检查test.id是否等于null,而不是仅检查它是否计算为true。这是因为id等于零将被评估为false,但它实际上是一个有效的id号。 id也可以是字符串或其他数据类型。

答案 1 :(得分:2)

原始回答:

最终你要保存对象,所以如果它已经保存了

test.save(flush:true)

将自动保存/更新对象。此外,hibernate确保每个对象只有一个持久化实例,如果有多个此类实例,则在获取另一个实例时会出现错误。

编辑答案:

由于您不想保存对象,因此您必须检查两件事:

  1. 对象是否附加到hibernate会话。
  2. 是否存在具有相同ID的另一个对象。
  3. 以下代码应该这样做:

    def exists = test.id?Test.get(test.id):false
    def isPersisted = false
    
    if(test.isAttached() || exists){
        isPersisted = true
    }
    

    我希望它能解决你的问题。

答案 2 :(得分:0)

为了测试域实例是否具有未保存状态,您只需使用

test.isDirty()