0

我有以下代码:

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

我首先commitChanges()提交所有查询。然后我清除了 Cayenne 的日志。在第二个commitChanges(),这显示在日志中:

信息:QueryLogger.logBeginTransaction:2013-07-10 07:37:11,214:---事务开始。信息:QueryLogger.logQuery:2013-07-10 07:37:11,218:插入scheduler_assignment到...信息:QueryLogger.logQuery:2013-07-10 07:37:11,241:删除scheduler_assignment ...信息:QueryLogger.logCommitTransaction: 2013-07-10 07:37:11,286:+++ 事务已提交。

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

4

1 回答 1

1

唯一合乎逻辑的解释是您的 ObjectContext 是“脏的” - 除了此处显示的内容之外,它还包含其他未提交的对象。发生这种情况的原因有很多,最常见的两个原因是:

(1) ObjectContext 范围太广,对上下文的更改来自应用程序中的其他地方。

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

关于 ObjectContexts 范围的一些提示:

  • 如果期望上下文处理写入(与仅读取相反;可以共享只读上下文),则不要在并发环境中共享 ObjectContext。
  • 处理写入的 ObjectContext 的理想范围是单个方法或单个请求。这保证没有其他人会同时访问它。
  • 通常,上下文的范围会更长。例如,它可以保存在 webapp 的会话中,并且可以在请求之间携带未提交的更改。在这种情况下仍考虑缩小其范围。例如,在一个会话中创建多个这样的上下文,每个都附加到一个给定的页面。因此,当您在另一个地方提交其他内容时,一个地方未提交的更改不会让您感到惊讶。
于 2013-07-10T18:40:57.563 回答