Cayenne对commitChanges()执行INSERT查询

时间:2013-07-10 17:54:52

标签: apache-cayenne

我有以下代码:

List<Assignment> assignments = objectContext.performQuery(assignmentQuery);
objectContext.commitChanges();
objectContext.deleteObjects(assignments);
objectContext.commitChanges();

我执行第一个commitChanges()来提交所有查询。然后我清除了Cayenne的日志。在第二个commitChanges()上,这会显示在日志中:

INFO:QueryLogger.logBeginTransaction:2013-07-10 07:37:11,214:---交易开始了。 信息:QueryLogger.logQuery:2013-07-10 07:37:11,218:INSERT INTO scheduler_assignment ... 信息:QueryLogger.logQuery:2013-07-10 07:37:11,241:从scheduler_assignment删除 ... 信息:QueryLogger.logCommitTransaction:2013-07-10 07:37:11,286:+++交易已提交。

我不明白为什么在我尝试删除时它正在执行INSERT语句。谁能解释一下?谢谢!

1 个答案:

答案 0 :(得分:1)

唯一合乎逻辑的解释是你的ObjectContext是“脏的” - 除了这里显示的内容之外,它还包含其他未提交的对象。这可能由于各种原因而发生,最常见的是:

(1)ObjectContext范围太宽,对上下文的更改源自应用程序中的其他位置。

(2)在提交期间源自回调/侦听器的更改。

关于ObjectContexts范围的一些提示:

  • 如果期望上下文处理写入(而不是只读取;可以共享只读上下文),则不要在并发环境中共享ObjectContexts。
  • 处理写入的ObjectContext的理想范围是单个方法或单个请求。这保证了其他人不会同时访问它。
  • 通常,上下文的范围会更长。例如。它可以保存在webapp中的会话中,并且可以在请求之间进行未提交的更改。在这种情况下仍然考虑缩小其范围。例如。在会话中创建多个这样的上下文,每个上下文附加到给定页面。因此,当您在其他地方提交其他内容时,一个地方的未提交更改不会让您感到惊讶。