3

在自定义 entityRepository 类中调用 entityRepository 的 find 方法时出现以下致命错误

致命错误:在 C:\Users\user\Desktop\projects\interview\application\libraries\Doctrine\ORM\OptimisticLockException 中,未捕获的异常“Doctrine\ORM\OptimisticLockException”带有消息“无法在未版本化的实体 Entities\Comment 上获得乐观锁”。 php:62 堆栈跟踪:#0 C:\Users\user\Desktop\projects\interview\application\libraries\Doctrine\ORM\EntityRepository.php(140): Doctrine\ORM\OptimisticLockException::notVersioned('Entities\Commen. ..') #1 C:\Users\user\Desktop\projects\interview\application\models\Repositories\CommentRepository.php(24): Doctrine\ORM\EntityRepository->find('Entities\Commen...', 1) #2 C:\Users\user\Desktop\projects\interview\application\controllers\CommentController.php(65): Repositories\CommentRepository->activateByIds(Array) #3 [内部函数]: CommentController->approveComments() #4 C:\Users\user\Desktop\projects\interview\system\core\CodeIgniter.php(359): call_user_func_array(Array, Array) #5 C:\Users\user\Desktop\projects\interview\ index.php(203): require_once('C:\Users\user\D...') in C:\Users\user\Desktop\projects\interview\application\libraries\Doctrine\ORM\OptimisticLockException.php 上线62

这是我调用 find 的方法

public function activateByIds($arrayOfIds){
        if (count($arrayOfIds)>=1) {
            for ($i=0; $i<count($arrayOfIds); $i++){
                $comment = parent::find('Entities\Comment', $arrayOfIds[$i]);
                $comment->setIsactive(1);
                $this->_em->merge($comment);
                $this->_em->flush();
            }
            return true;
        }
        else return false;
    }

我做错了什么??

4

1 回答 1

0

从我读到的你有一个OptimisticLockException

本文档中所述:

当对通过版本字段使用乐观锁定的对象的版本检查失败时,将引发 OptimisticLockException。

您可以在此处了解有关乐观锁的更多信息

我的猜测是它们与 $comment 变量有冲突:

  1. 第一次初始化 $comment ($i=0) 时,comment#1 被加载
  2. 第二次(i = 1,您找到comment#2,但comment 已经是一个实体并且被管理)$comment =... 尝试为comment#1 提供comment#2 的值,甚至是uniq 的id,所以您正在制造冲突。

试试这个:

public function activateByIds($arrayOfIds){
        $comments =array();

        if (count($arrayOfIds)>=1) {
            foreach($arrayOfIds as $i=>$id){

                $comments [$i] = $this->getEntityManager()->find('Entities\Comment', $id); //new comment, not the old one!
                $comments [$i]->setIsactive(1);
                $this->_em->merge($comments[$i]);
                $this->_em->flush();

            }
            return true;
        }
        else return false;
      unset ($comments);
    }

这样您就可以确定您不会尝试重复使用以前的评论而不是新的评论。

于 2013-03-05T02:44:33.457 回答