如何将存储在会话中的实体传递给新实体

How to pass an entity stored in session to new entity

我在会话中存储一个实体:

$equipoActividad = new EquiposActividades();
$equipoActividad->setEquipoControl($equipoControlExiste);
$actividadObj=$em->getRepository('AgcManagerBundle:Actividad')->findOneBy(array('idActividad'=>$idActividad));
$equipoActividad->setActividad($actividadObj);
$equipoActividad->setIdUsuario($user->getIdUser());
$tipoTransmision = new TipoTransmision();
$tipoTransmision->setIdTipoTransmision(0);
$protocolo = new Protocolo();
$protocolo->setIdProtocolo(0);
$equipoActividad->setTipoTransmision($tipoTransmision);
$equipoActividad->setProtocolo($protocolo);
$request->getSession()->set("equipoActividad", $equipoActividad);

我将这个实体存储到一个新实体后:

$equipoActividad = new EquiposActividades();
$equipoActividad = $request->getSession()->get("equipoActividad");

这是错误:

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

更新:

$equipoActividad = $request->getSession()->get("equipoActividad");
$equipoActividad = $em->merge($equipoActividad);
/* The next code is this*/
$formulario = $this->createForm(new EquipoActividadType(array('idUsuario' => $user->getIdUser())), $equipoActividad);          
$formulario->handleRequest($request);

错误:

Entity was not found. 
$equipoActividad = $request->getSession()->get("equipoActividad");

然后

$em->merge($equipoActividad);

所有将由学说处理的实体都需要进行管理。会话对象不再存在。因此,您不需要创建一个全新的实体管理器,因为 merge() 实体管理器会照顾您再次管理该实体,从那时起,您可以像从数据库中获取一样使用它。

如果您想了解更多,请阅读http://doctrine-orm.readthedocs.org/en/latest/cookbook/entities-in-session.html


编辑

这里的错误是由于你的对象状态:事实上你没有在会话存储之前持久化它(合并需要实体已经被持久化并刷新到数据库)。您可以 persist/flush 在存储到会话之前或之后,当您使用会话检索工具时。

顺便说一句,如果你不需要的话,你也可以不坚持:)