实体管理器保存和刷新
我正在尝试级联保存一些对象并检索它。 我有 3 个对象超过 3 个实体。
实体:
class Order
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var object $basket
*
* @ORM\OneToOne(targetEntity="Entity\Basket", inversedBy="order")
*/
protected $basket;
...
}
class Basket
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var array $declinations
*
* @ORM\OneToMany(targetEntity="Entity\BasketDeclination", mappedBy="basket")
*/
protected $declinations;
/**
* Order owner (reversed side)
*
* @var OrderClient $order
*
* @ORM\OneToOne(targetEntity="Entity\Order", mappedBy="basket")
*/
protected $order;
...
}
class BasketDeclination
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var integer $basket
*
* @ORM\ManyToOne(targetEntity="Entity\Basket", inversedBy="declinations")
*/
protected $basket;
...
}
对象优于实体:
class OrderObject
{
function __construct(
EntityManager $em,
Order $entity = null,
BasketObject $basket = null
)
{
$this->em = $em;
if (!$entity) {
$this->entity = new Order();
$this->basket = $basket;
} else {
$this->setDataFromEntity($entity);
}
}
protected function setDataFromEntity(Order $entity)
{
$basketFactory = new BasketFactory($this->em);
$this->entity = $entity;
$this->basket = $basketFactory->getBasket($entity->getBasket()->getId());
}
public function save($flush = false)
{
// save subObject
$this->basket->save();
// set link
$this->entity->setBasket($this->basket->getEntity());
$this->em->persist($this->entity);
if ($flush) {
$this->em->flush();
}
}
public function refresh()
{
$this->em->refresh($this->entity);
$this->setDataFromEntity($this->entity);
}
...
}
class BasketObject
{
function __construct(EntityManager $em, Basket $entity = null)
{
$this->em = $em;
if (!$entity) {
$this->entity = new Basket();
$this->declinations = array();
} else {
$this->setDataFromEntity($entity);
}
}
protected function setDataFromEntity(Basket $entity)
{
$this->entity = $entity;
$this->declinations = array();
foreach ($entity->getDeclinations() as $declination) {
$this->declinations[] = new BasketDeclinationObject($this->em, $declination);
}
}
public function save($flush = false)
{
foreach ($this->declinations as $declination) {
$declination->save();
}
$this->em->persist($this->entity);
if ($flush) {
$this->em->flush();
}
}
...
}
class BasketDeclinationObject
{
public function __construct(
EntityManager $em,
BasketDeclination $entity= null,
BasketObject $basket = null)
{
$this->em = $em;
if (!$entity) {
$this->entity = new BasketDeclination();
$this->basket = $basket;
} else {
$this->setDataFromEntity($entity);
}
}
protected function setDataFromEntity(BasketDeclination $entity)
{
$this->entity = $entity;
$declinationFactory = new DeclinationFactory($this->em);
$this->declination = $declinationFactory->getDeclination($entity->getDeclination()->getId());
}
public function save($flush = false)
{
if ($this->quantity <= 0) {
$this->em->remove($this->entity);
$this->remove = true;
return ;
}
if (!$this->entity->getId()) {
$this->entity->setBasket($this->basket->getEntity());
}
$this->entity->setQuantity($this->quantity);
$this->em->persist($this->entity);
if ($flush) {
$this->em->flush();
}
}
...
}
问题是,在我的测试中,当我尝试为篮子添加 BasketDeclination 然后保存时 篮子和篮子偏角都被保存。 然后,当我 $basket->refresh() 时,篮子被刷新,并且 BasketDeclinaiton 是从实体重建的,
但是当我有一个带有篮子的订单时,我添加 BasketDeclinaiton ($order->basket->addDeclination(... )) 当我保存时,所有实体都被保存 然后当我刷新订单时,我会取回订单和购物篮。 但实体 $basket->getDeclinations() 没有任何东西
我做错了什么?
I'm trying to save in cascade some object and retrieve it.
I have 3 Object over 3 entities.
Entites:
class Order
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var object $basket
*
* @ORM\OneToOne(targetEntity="Entity\Basket", inversedBy="order")
*/
protected $basket;
...
}
class Basket
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var array $declinations
*
* @ORM\OneToMany(targetEntity="Entity\BasketDeclination", mappedBy="basket")
*/
protected $declinations;
/**
* Order owner (reversed side)
*
* @var OrderClient $order
*
* @ORM\OneToOne(targetEntity="Entity\Order", mappedBy="basket")
*/
protected $order;
...
}
class BasketDeclination
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var integer $basket
*
* @ORM\ManyToOne(targetEntity="Entity\Basket", inversedBy="declinations")
*/
protected $basket;
...
}
Object Over Entity:
class OrderObject
{
function __construct(
EntityManager $em,
Order $entity = null,
BasketObject $basket = null
)
{
$this->em = $em;
if (!$entity) {
$this->entity = new Order();
$this->basket = $basket;
} else {
$this->setDataFromEntity($entity);
}
}
protected function setDataFromEntity(Order $entity)
{
$basketFactory = new BasketFactory($this->em);
$this->entity = $entity;
$this->basket = $basketFactory->getBasket($entity->getBasket()->getId());
}
public function save($flush = false)
{
// save subObject
$this->basket->save();
// set link
$this->entity->setBasket($this->basket->getEntity());
$this->em->persist($this->entity);
if ($flush) {
$this->em->flush();
}
}
public function refresh()
{
$this->em->refresh($this->entity);
$this->setDataFromEntity($this->entity);
}
...
}
class BasketObject
{
function __construct(EntityManager $em, Basket $entity = null)
{
$this->em = $em;
if (!$entity) {
$this->entity = new Basket();
$this->declinations = array();
} else {
$this->setDataFromEntity($entity);
}
}
protected function setDataFromEntity(Basket $entity)
{
$this->entity = $entity;
$this->declinations = array();
foreach ($entity->getDeclinations() as $declination) {
$this->declinations[] = new BasketDeclinationObject($this->em, $declination);
}
}
public function save($flush = false)
{
foreach ($this->declinations as $declination) {
$declination->save();
}
$this->em->persist($this->entity);
if ($flush) {
$this->em->flush();
}
}
...
}
class BasketDeclinationObject
{
public function __construct(
EntityManager $em,
BasketDeclination $entity= null,
BasketObject $basket = null)
{
$this->em = $em;
if (!$entity) {
$this->entity = new BasketDeclination();
$this->basket = $basket;
} else {
$this->setDataFromEntity($entity);
}
}
protected function setDataFromEntity(BasketDeclination $entity)
{
$this->entity = $entity;
$declinationFactory = new DeclinationFactory($this->em);
$this->declination = $declinationFactory->getDeclination($entity->getDeclination()->getId());
}
public function save($flush = false)
{
if ($this->quantity <= 0) {
$this->em->remove($this->entity);
$this->remove = true;
return ;
}
if (!$this->entity->getId()) {
$this->entity->setBasket($this->basket->getEntity());
}
$this->entity->setQuantity($this->quantity);
$this->em->persist($this->entity);
if ($flush) {
$this->em->flush();
}
}
...
}
The problem is that in my test when I try for a basket to add BasketDeclination then save
the Basket is saved and BasketDeclination too.
Then when I $basket->refresh() the basket is refresh and the BasketDeclinaiton is rebuild from entity
BUT when I have an order whith a basket and I add BasketDeclinaiton ($order->basket->addDeclination(...))
When I save all entities are saved
then when I refresh the order I get back the order and the basket.
but the entity $basket->getDeclinations() does not have any thing
What I am doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果问题确实是实体管理器没有刷新关联(如 Mohammad AbuShady),告诉您的实体级联刷新操作的答案。
If the problem is indeed that the entity manager is not
refresh
ing associations (as suggested by Mohammad AbuShady), the answer to tell your entities to cascade therefresh
operation.我将有两个猜测:
您应该对类使用级联注释,以允许级联“持续”,并且可能也允许级联“刷新”。如 文档。像这样的东西:
@ORM\OneToOne(targetEntity="Entity\Order",mappedBy="basket",cascade={"persist","remove","refresh"})
你缺少一个
persist( )
或在刷新之前对偏角执行flush()
。如果您没有级联,则需要在要保留的每个对象上调用它们,然后调用refresh()
方法。(当您使用嵌套对象时,检查代理是否已创建并且工作正常也是一个好主意)
I will go with two guesses:
You should use the cascade annotation to the classes to allow cascade "persist" and probably cascade "refresh" too. As stated on the documentation. Something like:
@ORM\OneToOne(targetEntity="Entity\Order", mappedBy="basket", cascade={"persist", "remove", "refresh"})
You are missing a
persist()
or aflush()
on the Declinations before refreshing. If you are not cascading you need to call them on each object you want to keep and THEN call therefresh()
method.(It's always a good idea too to check that your proxies are created and working all right when you work with nested objects)
我记得这来自doctrine1,不确定这里是否同样适用,在doctrine1中刷新只刷新了第一个直接对象,为了处理关系和你需要添加第二个参数
deep = true
来处理所有的东西相关的对象也是如此,你可以尝试研究类似的东西。I remember this from doctrine1, not sure if the same applies here, in doctrine1 refreshing only refreshed the first direct object, to handle the relations and stuff you need to add a second parameter
deep = true
to handle all the related objects too, you can try looking into something like that.