【发布时间】:2012-12-05 00:11:25
【问题描述】:
我正在使用 Symfony2 和 Doctrine
我有一个原则实体,它被序列化/反序列化到一个会话并在多个屏幕中使用。这个实体有许多一对多的关联。
学说实体有以下一对多,例如:
class Article {
...
/**
* @ORM\OneToMany(targetEntity="image", mappedBy="article", cascade= {"merge","detach","persist"})
*/
protected $images;
public function __construct()
{
$this->images = new ArrayCollection();
}
.....
}
文章实体的保存和检索如下:
public function saveArticle($article)
{
$articleSerialized = serialize($article);
$this->session->set('currentArticle',$articleSerialized);
}
public function getArticle()
{
$articleSerialized = $this->session->get('currentArticle');
$article = unserialize($articleSerialized);
$article = $this->em->merge($article);
return $article;
}
我可以在会话中多次保存和加载实体,然后将其合并回实体管理器并保存。仅当它是一个新实体时。
但是,一旦我从数据库加载一个实体,然后将其保存到会话中,我就会遇到问题。
我从其他帖子中知道,在您对保存的实体进行反序列化后,您必须运行 $em->merge($entity);
我能够合并实体,添加一个新的子实体(一对多)然后保存:
$article = $this->getArticle(); //Declared above, gets article from session
$image = new Image();
$image->setFilename('image.jpeg');
$article->addImage($image);
$this->saveArticle($article); //Declared above, returns the article to session
但是,在第一次合并和图像添加之后,我无法再添加任何子实体。如果我尝试添加第二张图片,它会返回以下错误:
A managed+dirty entity <<namespace of entity>>
image@0000000067078d7400000000221d7e02 can not
be scheduled for insertion.
总而言之,我可以对实体进行任意数量的更改并将其保存到会话中,但是如果我在添加子实体时多次运行 $em->merge,则新的子实体将被标记为脏.
有人知道为什么实体会被标记为脏吗?我是否需要重置实体本身,如果需要,我该怎么做?
【问题讨论】:
-
合并前是否尝试过刷新实体?我假设您的实体被标记为脏,因为一旦您合并一个实体,另一个实体(具有旧状态)与您更新的实体不匹配,因此是脏的。
-
我确实玩过刷新。运行 $em->merge 后,我对文章和图像进行了 $em->refresh。还是不行。有趣的是,如果我在持久化之前根本不合并实体,我可以添加任意数量的图像并且它们保存得很好。唯一的问题是我无权访问当前保存的(因为它们是代理)
标签: symfony serialization doctrine-orm