如何创建Grails域对象但不保存?

约翰

我有一个应该创建域对象的方法。但是,如果在构建对象的过程中发生条件,则该方法应仅返回而不保存对象。

鉴于:

class SomeDomainObjectClass {
    String name
}

class DomCreatorService {
    def createDom() {
        SomeDomainObjectClass obj = new SomeDomainObjectClass(name: "name")

        // do some processing here and realise we don't want to save the object to the database
        if (!dontWannaSave) {
            obj.save(flush: true)
        }
    }
}

在我的测试中(服务是DomCreatorService的实例):

expect: "it doesn't exist at first" 
SomeDomainObjectClass.findByName("name") == null

when: "we attempt to create the object under conditions that mean it shouldn't be saved"
// assume that my test conditions will mean dontWannaSave == true and we shouldn't save     
service.createDom() 

then: "we shouldn't be able to find it and it shouldn't exist in the database"
// check that we still haven't created an instance
SomeDomainObjectClass.findByName("name") == null

我的最后一行失败了。为什么最后一个findByName返回true,即为什么可以找到我的对象?我以为它只会找到保存到数据库的对象。我应该测试什么以查看是否尚未创建对象?

伯特·贝克维斯

您必须遗漏一些东西-如果您仅创建一个实例但不对其调用任何GORM方法,则Hibernate无法知道它。它开始管理对象的唯一方法是通过初始save()调用将其“附加” 没有它,就像其他任何对象一样。

您会看到@agusluc所描述的内容,但这对您没有影响。如果加载以前保留的实例并修改任何属性,则在请求结束时,Hibernate的脏检查将启动,检测到此已附加但未保存的实例是脏的,即使您不进行更改,它也会将更改推送到数据库打电话save()在这种情况下,如果您不想继续进行修改,请通过调用将该对象从会话中分离出来discard()这与您看到的内容无关,因为您没有附加任何内容。

可能已经有具有该name属性的实例检查findByName查询返回的其他属性,我假设您将看到它是先前持久的实例。

另外,这是单元测试还是集成?确保使用集成测试来实现持久性-单元测试模拟不适用于测试域类,它仅应用于在测试其他类型的类(例如控制器)时为域类赋予GORM行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Grails关系不保存

来自分类Dev

在Grails中创建多个域对象

来自分类Dev

如何在Java中创建File对象而不保存到硬盘

来自分类Dev

Django REST序列化器:创建对象而不保存

来自分类Dev

RestKit:创建一个对象而不保存它

来自分类Dev

Django REST序列化器:创建对象而不保存

来自分类Dev

如何在Grails中复制域对象?

来自分类Dev

如何定义 Grails 域对象关系

来自分类Dev

如何在不保存对数组的引用的情况下创建具有某些数组值的对象?

来自分类Dev

是否可以为grails域对象保存特定的ID?

来自分类Dev

用于保存域对象的Grails可重用服务

来自分类Dev

创建一个新的POI工作簿,但不保存它

来自分类Dev

Grails 2-无法创建Spring Security域对象

来自分类Dev

捕获相机图像但不保存文件

来自分类Dev

Gulpfile 更改 css 但不保存它

来自分类Dev

Mongoose / MongoDB不保存对象

来自分类Dev

关闭对象而不保存更改

来自分类Dev

Android DBFlow不保存对象

来自分类Dev

创建nsmanagedobject而不保存[@Example]

来自分类Dev

保存尝试将保存字段/列,但不保存值

来自分类Dev

如何删除具有多对多关系的grails域对象?

来自分类Dev

grails:不要再次保存相似的域对象,请使用当前对象

来自分类Dev

CoreStore 在上下文中创建对象而不保存到数据库

来自分类Dev

如何在不保存的情况下更新尚未保存的对象?

来自分类Dev

Grails获取子域对象

来自分类Dev

从ER图创建grails域

来自分类Dev

对象上的Typescript useState钩子不保存

来自分类Dev

修改的JPARepository CPRQ不保存完整对象

来自分类Dev

Django方法相同的对象不保存