-
Notifications
You must be signed in to change notification settings - Fork 2.5k
/
DDC2306Test.php
151 lines (125 loc) · 4.19 KB
/
DDC2306Test.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @group DDC-2306
*/
class DDC2306Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
/**
* {@inheritDoc}
*/
protected function setup()
{
parent::setup();
$this->_schemaTool->createSchema(array(
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306Zone'),
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306User'),
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306Address'),
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2306UserAddress'),
));
}
/**
* Verifies that when eager loading is triggered, proxies are kept managed.
*
* The problem resides in the refresh hint passed to {@see \Doctrine\ORM\UnitOfWork::createEntity},
* which, as of DDC-1734, causes the proxy to be marked as un-managed.
* The check against the identity map only uses the identifier hash and the passed in class name, and
* does not take into account the fact that the set refresh hint may be for an entity of a different
* type from the one passed to {@see \Doctrine\ORM\UnitOfWork::createEntity}
*
* As a result, a refresh requested for an entity `Foo` with identifier `123` may cause a proxy
* of type `Bar` with identifier `123` to be marked as un-managed.
*/
public function testIssue()
{
$zone = new DDC2306Zone();
$user = new DDC2306User;
$address = new DDC2306Address;
$userAddress = new DDC2306UserAddress($user, $address);
$user->zone = $zone;
$address->zone = $zone;
$this->_em->persist($zone);
$this->_em->persist($user);
$this->_em->persist($address);
$this->_em->persist($userAddress);
$this->_em->flush();
$this->_em->clear();
/* @var $address DDC2306Address */
$address = $this->_em->find(__NAMESPACE__ . '\\DDC2306Address', $address->id);
/* @var $user DDC2306User|\Doctrine\ORM\Proxy\Proxy */
$user = $address->users->first()->user;
$this->assertInstanceOf('Doctrine\ORM\Proxy\Proxy', $user);
$this->assertInstanceOf(__NAMESPACE__ . '\\DDC2306User', $user);
$userId = $user->id;
$this->assertNotNull($userId);
$user->__load();
$this->assertEquals(
$userId,
$user->id,
'As of DDC-1734, the identifier is NULL for un-managed proxies. The identifier should be an integer here'
);
}
}
/** @Entity */
class DDC2306Zone
{
/** @Id @Column(type="integer") @GeneratedValue */
public $id;
}
/**
* @Entity
*/
class DDC2306User
{
/** @Id @Column(type="integer") @GeneratedValue */
public $id;
/**
* @var DDC2306UserAddress[]|\Doctrine\Common\Collections\Collection
*
* @OneToMany(targetEntity="DDC2306UserAddress", mappedBy="user")
*/
public $addresses;
/** @ManyToOne(targetEntity="DDC2306Zone", fetch="EAGER") */
public $zone;
/** Constructor */
public function __construct() {
$this->addresses = new ArrayCollection();
}
}
/** @Entity */
class DDC2306Address
{
/** @Id @Column(type="integer") @GeneratedValue */
public $id;
/**
* @var DDC2306UserAddress[]|\Doctrine\Common\Collections\Collection
*
* @OneToMany(targetEntity="DDC2306UserAddress", mappedBy="address", orphanRemoval=true)
*/
public $users;
/** @ManyToOne(targetEntity="DDC2306Zone", fetch="EAGER") */
public $zone;
/** Constructor */
public function __construct() {
$this->users = new ArrayCollection();
}
}
/** @Entity */
class DDC2306UserAddress
{
/** @Id @Column(type="integer") @GeneratedValue */
public $id;
/** @ManyToOne(targetEntity="DDC2306User") */
public $user;
/** @ManyToOne(targetEntity="DDC2306Address", fetch="LAZY") */
public $address;
/** Constructor */
public function __construct(DDC2306User $user, DDC2306Address $address)
{
$this->user = $user;
$this->address = $address;
$user->addresses->add($this);
$address->users->add($this);
}
}