使用同一cfquery
代码中的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。据我所知,这可能发生因为hibernate会话只有在到达结束cftransaction
时才会被刷新,这是正确的吗?
我注意到,由于另一个问题,我会问另一个问题。但基本上,我必须在运行ORM语句之前禁用特定表上的触发器,否则将导致StaleStateException
。
在同一DISABLE TRIGGER
内的ENABLE TRIGGER
和cftransaction
语句之间进行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语句,并使语句按顺序运行?也许我完全误解了这个问题,但我现在很困惑。
答案 0 :(得分:0)
尝试使用ORMExecuteQuery。
ORMExecuteQuery("update SomeEntity set SomeProperty = 'test' where id = :id",
{"id"="someId"});`
这些会立即执行并跳过ORM会话。