如何使用 GORM 测试实例是不是持久化到数据库中?

Posted

技术标签:

【中文标题】如何使用 GORM 测试实例是不是持久化到数据库中?【英文标题】:How do I test if an Instance is persisted in the Database with GORM?如何使用 GORM 测试实例是否持久化到数据库中? 【发布时间】:2014-09-19 16:48:03 【问题描述】:

当我将实例另存为:

test.save() 

保存可能会失败。我可以的

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

考虑这种情况,我从另一个函数中获取了一个实例,但由于我不会再次保存该实例而无法进行此检查。

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

【问题讨论】:

【参考方案1】:

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

鉴于 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。那是因为等于 0 的 id 将评估为 false,但它实际上是一个有效的 id 号。 id 也可以是字符串或其他数据类型。

【讨论】:

不适用于复合键【参考方案2】:

原答案:

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

test.save(flush:true)

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

修改后的答案:

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

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

以下代码应该这样做:

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

if(test.isAttached() || exists)
    isPersisted = true

希望它能解决你的问题。

【讨论】:

我说我不想再保存对象了。 @confile 那么你应该分离对象然后尝试处理它。 Aa 据我了解,您的代码正在尝试检查验证错误,而您不想保存,只需调用 validate() 即可。如果你的意思是别的,请详细解释一下。 我不检查是否有任何错误我想检查对象是否已持久化。 为什么一定要检查 isAttached 和存在? 我认为它非常简单,attached 告诉你对象是否附加到休眠会话,即它已经持久化。但是如果一个对象处于分离状态,它可能会先被持久化,然后再分离,这就是为什么你需要检查它是否已经存在于数据库中。【参考方案3】:

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

test.isDirty()

【讨论】:

如果您在另一个函数中创建对象,这将不起作用。然后你总是假的。

以上是关于如何使用 GORM 测试实例是不是持久化到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

检索域的 GORM 持久属性列表

如何获取 GORM 对象映射到的表的名称?

CoreData+MagicalRecord 如何对记录是不是成功持久化到 sqlite 文件进行单元测试

Go语言使用gorm对MySQL进行性能测试

Go GORM 有很多关系。如何将数据存储到MYSQL DB

在使用 NHibernate 进行持久性的项目中测试数据模型