如何禁用带有注释的Doctrine持久级联?

PMo*_*bed 2 doctrine symfony doctrine-orm

考虑如下两个类:

/**
 * @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;

}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中

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

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

$em->persist($notification);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

我的问题是task当我坚持时如何避免坚持$notification?上面的代码还会将task状态更改为1。

我知道我可以做下面的事情,但是我想知道是否可以通过注释来做?

$em->flush($notification);
Run Code Online (Sandbox Code Playgroud)

为什么学说坚持另一面ManyToOne

Ric*_*ard 5

持久级联与此无关。例如,这仍将更新任务:

$task = $em->getRepository("AppBundle:Task")->find(1);
$task->setStatus(1);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

一个普遍的误解是持久化一个实体意味着以某种方式将其标记为准备更新,这是不正确的。

持久存在实体意味着实体现在由实体管理器管理。

对任何托管实体的更改将在刷新时提交,如果该实体已被托管,则持久性不会更改。

对于您的任务对象,您已经通过实体管理器将其获取,因此它被视为托管对象,并且您对其进行的任何更新都将在刷新时提交,无论您是否对其进行持久化。

总之,如果您不希望通过全局刷新来更新托管实体,请不要对其进行更新,或者仅对要专门保存到数据库的实体调用-> flush。

更多信息:

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