0

在將域對象保存在服務中時,在保存域時使用flush: true,在必須使用該對象之前,對象不會保存。是否可以強制刷新保存在服務中的域名?

Domain domain = new Domain(property: something.toString()).save(failOnError: true, flush: true) 

我不確定如何在我正在使用的服務中強制刷新休眠會話。

對於某些上下文,我正在對API服務進行API調用,該API服務會轉到另一個服務,我將其保存到域,然後返回到API服務,然後將字符串添加到RabbitMQ隊列中,然後返回200OK給用戶。但是,因爲該域沒有在第二個服務中保存,所以當該項目被添加到隊列中時,rabbitMQ正在處理消息,之後域被保存。

編輯:

我目前的解決辦法:

API控制器:

def apiActionCreate() 
{ 
    Map returnMap = apiService.createAction(params, request) 
    rabbitSend staticQueue, [id: returnMap.id.toString()] 
} 

API服務:

Map someAction(UUID id) 
{ 
    Domain domain = new Domain(property: something.toString()).save(failOnError: true, flush: true) 
} 

Map createAction(GrailsParameterMap params, HttpServletRequest request) 
{ 
    //do some logic related to a related domain 
    seperateService.someAction(domain.id) 
} 

在那裏我節省了域名服務

+1

也許是因爲[尚未提交]交易? –

+0

以上就是爲什麼這個實例還不存在。域實例上的'flush:true'提示就是這樣。提示Hibernate將任何掛起的SQL刷新到數據庫。但是,根據您的事務隔離級別,這些更改可能對其他線程或Hibernate會話不可見。你可以考慮設置一個限制較少的隔離級別,但是它有缺陷或髒讀取的缺點(取決於你選擇的隔離級別)。 –

+0

嗯.. @JoshuaMoore考慮到這一點,從控制器到API服務,然後是我需要的任何東西,然後回到控制器,會更容易嗎?對於類似這樣的問題,我的經驗是,當您從服務返回到控制器時,保存在該服務中的信息會持久保存到數據庫中。 –

回答

0

您可以創建一個事務,這個事務在完成時會保留到DDBB。

MyDomain.withTransaction{ 
     somecode() 
} 
+0

這對我來說並不可悲。我無法讓這個工作正常。我最終回到了控制器級別,並在向RabbitMQ發送請求之前讓域保存。 –

相關問題