如何禁用主义坚持级联注解?

问题描述 投票:1回答:1

考虑两个类象下面这样:

/**
 * @ORM\Table(name="notifications")
 */
class Notification {

    /**
     * @var integer
     *
     * @ORM\Column(name="uid", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Task")
     * @ORM\JoinColumn(name="task_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $task;

}


/**
 * @ORM\Table(name="tasks")
 */
class Task {

    /**
     * @var integer
     *
     * @ORM\Column(name="uid", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="status", type="smallint")
     */
    private $status;

}

在我的控制器我有

$task = $em->getRepository("AppBundle:Task")->find(1);
$task->setStatus(1);

$notification = new Notification();
$notification->setTask($task);

$em->persist($notification);
$em->flush();

我的问题是如何避免持续task当我坚持$notification?与以上代码它也改变了task状态为1。

我知道我可以做类似下面,但我想知道是否有可能与注释做呢?

$em->flush($notification);

为什么坚持原则的ManyToOne对方?

symfony doctrine-orm doctrine
1个回答
4
投票

坚持级联有无关这一点。例如,这仍然会更新任务:

$task = $em->getRepository("AppBundle:Task")->find(1);
$task->setStatus(1);
$em->flush();

一个常见的误解是,坚持实体意味着它以某种方式标记为准备更新,这是不正确的。

Persisting an entity意味着实体现在由实体管理器进行管理。

任何管理实体的变化会在冲洗承诺,坚持不改变,如果实体已经被管理。

在你的任务对象的情况下,你已经与实体管理器获取它,所以它被认为是管理和您所做的任何更新将在冲洗承诺,无论你是否称之为坚持对与否。

总之,不更新管理实体,如果你不希望他们通过一个全球性的冲洗不更新,或来电 - >冲洗上,你特别想保存到数据库中的实体。

更多信息:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#synchronization-with-the-database

© www.soinside.com 2019 - 2024. All rights reserved.