From 6f4f8f8cb1789552c6c4db6830b85fa6cb31e5ed Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 15 Aug 2010 19:51:06 +0200 Subject: [PATCH] DDC-742 - Fix issue with collections that are set to fetch=EAGER not being initialized with takeSnapshot() correctly --- lib/Doctrine/ORM/UnitOfWork.php | 1 + .../ORM/Functional/Ticket/DDC742Test.php | 109 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 946197761..242d84b74 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -1941,6 +1941,7 @@ class UnitOfWork implements PropertyChangedListener $pColl->setInitialized(false); } else { $this->loadCollection($pColl); + $pColl->takeSnapshot(); } $this->originalEntityData[$oid][$field] = $pColl; } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php new file mode 100644 index 000000000..3c19e0f3f --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC742Test.php @@ -0,0 +1,109 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC742User'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC742Comment') + )); + } catch(\Exception $e) { + + } + } + + public function testIssue() + { + $user = new DDC742User(); + $user->title = "Foo"; + $user->favoriteComments = new ArrayCollection(); + + $comment1 = new DDC742Comment(); + $comment1->content = "foo"; + + $comment2 = new DDC742Comment(); + $comment2->content = "bar"; + + $comment3 = new DDC742Comment(); + $comment3->content = "baz"; + + $user->favoriteComments->add($comment1); + $user->favoriteComments->add($comment2); + + $this->_em->persist($user); + $this->_em->persist($comment1); + $this->_em->persist($comment2); + $this->_em->persist($comment3); + $this->_em->flush(); + $this->_em->clear(); + + $user = $this->_em->find(get_class($user), $user->id); + $comment3 = $this->_em->find(get_class($comment3), $comment3->id); + $user->favoriteComments->add($comment3); + $this->_em->flush(); + } +} + +/** + * @Entity + * @Table(name="users") + */ +class DDC742User +{ + /** + * User Id + * + * @Id + * @GeneratedValue(strategy="AUTO") + * @Column(type="integer") + * @var integer + */ + public $id; + /** + * @Column(length=100, type="string") + * @var string + */ + public $title; + /** + * @ManyToMany(targetEntity="DDC742Comment", cascade={"persist"}, fetch="EAGER") + * @JoinTable( + * name="user_comments", + * joinColumns={@JoinColumn(name="user_id",referencedColumnName="id")}, + * inverseJoinColumns={@JoinColumn(name="comment_id", referencedColumnName="id")} + * ) + * + * @var Doctrine\ORM\PersistentCollection + */ + public $favoriteComments; +} + +/** + * @Entity + * @Table(name="comments") + */ +class DDC742Comment +{ + /** + * User Id + * + * @Id + * @GeneratedValue(strategy="AUTO") + * @Column(type="integer") + * @var integer + */ + public $id; + /** + * @Column(length=100, type="string") + * @var string + */ + public $content; +} \ No newline at end of file