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

con*_*ile 8 grails grails-orm grails-domain-class

当我将实例保存为:

test.save() 
Run Code Online (Sandbox Code Playgroud)

保存可能会失败.我可以

if (!test.save(flush:true) {
  // save failed
} 
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

鉴于OP的原始问题

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

就在这里。调用实例的域类的exist()方法。

假设我们有一个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.
Run Code Online (Sandbox Code Playgroud)

请注意检查test.id是否等于null,而不只是检查它的评估结果是否为true。那是因为一个等于零的id的取值为false,但实际上它是一个有效的id号。另外,id可以是字符串或其他数据类型。


Cra*_*oad 4

原答案:

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

test.save(flush:true)
Run Code Online (Sandbox Code Playgroud)

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

编辑后的答案:

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

  1. 对象是否附加到休眠会话。
  2. 具有相同 id 的另一个对象是否存在。

以下代码应该可以做到这一点:

def exists = test.id?Test.get(test.id):false
def isPersisted = false

if(test.isAttached() || exists){
    isPersisted = true
}
Run Code Online (Sandbox Code Playgroud)

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