2013-05-03 16 views
2

在同一cftransaction標記中使用cfquery和ORM操作混合原始查詢安全嗎?在同一個cftransaction中混合原始查詢和ORM操作

<cftransaction> 
    <cfquery datasource="test">...</cfqueyr> <!--- A ---> 
    <cfset var e = entityLoadByPK('SomeEntity', someId)> <!--- B ---> 
    <cfset e.setSomeProperty('test')> <!--- C ---> 
    <cfquery datasource="test">...</cfquery> <!--- D ---> 
</cftransaction> 

通過在看看SQL事件探查器,看來查詢不會得到順序執行的,它們出現在探查的順序如下:A,B,d,C。從我的理解,這可能會發生,因爲休眠會話只會在關閉cftransaction時纔會被刷新,這是否正確?

我注意到,因爲另一個問題至極,我會問另一個問題。但基本上,我必須在運行ORM語句之前禁用特定表上的觸發器,否則將導致StaleStateException

具有相同cftransactionDISABLE TRIGGERENABLE TRIGGER語句之間的ORM操作時,並沒有解決問題,因爲ENABLE TRIGGER的ORM查詢之前跑。但是,使用以下時,它的工作原理:

<cfquery datasource="test"> 
    DISABLE TRIGGER ALL ON Test; 
</cfquery> 

<cftransaction> 
    <!--- ORM CODE ---> 
    <!--- Other cfquery ---> 
</cftransaction> 

<cfquery datasource="test"> 
    ENABLE TRIGGER ALL ON Test; 
</cfquery> 

我也嘗試了ORM語句後立即使用ormFlush(),但它並沒有奏效。有沒有辦法在同一個cftransaction中混合原始查詢和ORM語句,並讓語句順序運行?也許我完全誤解了這個問題,但我現在很困惑。

+1

我再次仔細看看'ormFlush()'。我相信這是行得通的,我之前使用它沒有任何問題。 – Henry 2013-05-03 18:55:19

+0

@亨利,我必須等到週一才能再次檢查。如果你安裝了CF,你可以通過在表中插入3行(沒有orm,orm,沒有orm)來確認你的聲明並檢查結果嗎?謝謝! – plalx 2013-05-03 23:30:28

回答

0

嘗試使用ORMExecuteQuery。

ORMExecuteQuery("update SomeEntity set SomeProperty = 'test' where id = :id", 
    {"id"="someId"});` 

這些會立即執行並跳過ORM會話。

+0

感謝您的提示。我沒有花時間進一步調查問題,並檢查我的假設是否正確。你知道如何將原始查詢與ORM操作混合在一起,以及爲什麼使用'ormFlush'在我的情況下無法工作?我將很快發佈有關該問題的附加信息。 – plalx 2013-11-21 16:57:15

+0

不,我想'ORMFlush'可以做到這一點...... – 2013-11-22 15:09:26