原则2:批处理引用其他实体的实体插入时的奇怪行为 [英] Doctrine 2: weird behavior while batch processing inserts of entities that reference other entities

查看:141
本文介绍了原则2:批处理引用其他实体的实体插入时的奇怪行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试这里描述的批处理方法:
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.html



我的代码看起来像这样

  $ limit = 10000; 
$ batchSize = 20;
$ role = $ this-> em-> getRepository('userRole') - > find(1);
($ i = 0; $ i $ = $ limit; $ i ++)
{
$ user = new \Entity\User;
$ user-> setName('name'。$ i);
$ user-> setEmail('email'。$ i.'@email.blah');
$ user-> setPassword('pwd'。$ i);
$ user-> setRole($ role);
$ this-> em-> persist($ user);
if(($ i%$ batchSize)== 0){
$ this-> em-> flush();
$ this-> em-> clear();
}
}

问题是,第一次调用em - > flush()也$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ b

是否有任何解决方法可用于这种情况?只有一个我可以做的工作是每次在循环中获取用户角色实体



谢谢

解决方案

clear()分离实体管理器管理的所有实体,因此 $ role 也是分离的,试图坚持一个独立的实体创建一个新的实体。



清除后,您应该再次获取角色:

  $ this-> em-> clear(); 
$ role = $ this-> em-> getRepository('userRole') - > find(1);

或者只是创建一个引用:

  $这 - > EM->清除(); 
$ role = $ this-> em-> getReference('userRole',1);


I am trying out the batch processing method described here: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.html

my code looks like this

    $limit = 10000;
    $batchSize = 20;
    $role = $this->em->getRepository('userRole')->find(1);
    for($i = 0; $i <= $limit; $i++)
    {
        $user = new \Entity\User;
        $user->setName('name'.$i);
        $user->setEmail('email'.$i.'@email.blah');
        $user->setPassword('pwd'.$i);
        $user->setRole($role);
        $this->em->persist($user);
         if (($i % $batchSize) == 0) {
             $this->em->flush();
             $this->em->clear();
        }
    }

the problem is, that after the first call to em->flush() also the $role gets detached and for every 20 users a new role with a new id is created, which is not what i want

is there any workaround available for this situation? only one i could make work is to fetch the user role entity every time in the loop

thanks

解决方案

clear() detaches all entities managed by the entity manager, so $role is detached too, and trying to persist a detached entity creates a new entity.

You should fetch the role again after clear:

$this->em->clear();
$role = $this->em->getRepository('userRole')->find(1);

Or just create a reference instead:

$this->em->clear();
$role = $this->em->getReference('userRole', 1);

这篇关于原则2:批处理引用其他实体的实体插入时的奇怪行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆