簡體   English   中英

如何創建Grails域對象但不保存?

[英]How to create Grails domain object but do not save?

我有一個應該創建域對象的方法。 但是,如果在構建對象的過程中發生條件,則該方法應僅返回而不保存對象。

鑒於:

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的臟檢查將啟動,檢測到此已附加但未保存的實例是臟的,即使您不進行更改,它也會將更改推送到數據庫t調用save() 在這種情況下,如果您不希望持久化編輯,請通過調用discard()將對象與會話分離。 這與您看到的內容無關,因為您沒有附加任何內容。

可能已經有一個具有該name屬性的實例。 檢查一下findByName查詢返回的其他屬性,我假設您將看到它是以前持久的實例。

另外,這是單元測試還是集成? 確保使用集成測試來實現持久性-單元測試模擬不適用於測試域類,它僅用於在測試其他類型的類(例如控制器)時為域類賦予GORM行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM