在同一个cftransaction中混合原始查询和ORM操作

时间:2013-05-03 17:32:07

标签: hibernate coldfusion cfquery stalestateexception

使用同一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 TRIGGERcftransaction语句之间进行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 个答案:

答案 0 :(得分:0)

尝试使用ORMExecuteQuery。

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

这些会立即执行并跳过ORM会话。