2013-03-04 79 views
2

我得到以下致命错误而调用entityRepository的查找方法在自定义entityRepository类doctrine2:选择错误

致命错误:未捕获的异常“学说\ ORM \ OptimisticLockException”与消息“无法得到关于非版本控制的实体乐观锁Entities \ Comment'在C:\ Users \ user \ Desktop \ projects \ interview \ application \ libraries \ Doctrine \ ORM \ OptimisticLockException.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 \面试\应用程序\控制器\ CommentController.php(65):存储库\ CommentRepository-> activateByIds(数组)#3 [内部函数]:CommentController-> approveComments()#4 C:\ Users \ user \ Desktop \ projects \ 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 ...')在C:\用户\用户\桌面\项目\访谈\程序\库\原则\ ORM \ OptimisticLockException.php上线62

这里有方法,我称之为找到

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; 
    } 

我在做什么错?

+0

我在学说和编程本身上都很新颖。无法找出什么意思,该实体未版本化 – 2013-03-04 11:46:26

回答

0

从我读你有一个OptimisticLockException

正如this documentation说:

An OptimisticLockException is thrown when a version check on an object that uses optimistic locking through a version field fails.

你可以找到更多关于乐观锁here

我的猜测是,他们是有冲突$ comment变量:

  1. 第一次初始化$ comment($ i = 0)注释#1被加载
  2. 第二次(i = 1,你找到注释#2但注释已经是实体并且被管理)$ comment = .. 。试图给注释#1注释#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); 
    } 

这样。

+0

我试过你的建议,但无论如何,我得到这个例外。当我使用parent :: findby代替查找时,我没有异常。但是当你需要通过id查找时,它不是正确的编码方式,因为find的执行时间更短,如果ID是主键,则通过id查找 – 2013-03-05 05:24:52

+0

true,请尝试:$ this-> getEntityManager() - > find(。 ...而不是父:: find(.. – bleuscyther 2013-03-05 05:36:47

+0

太棒了!那有效!!谢谢,男士。但是这种行为的原因是什么? – 2013-03-05 06:05:44