如何禁用带有注释的条令持久级联



考虑以下两个类:

/**
 * @ORMTable(name="notifications")
 */
class Notification {
    /**
     * @var integer
     *
     * @ORMColumn(name="uid", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @ORMManyToOne(targetEntity="Task")
     * @ORMJoinColumn(name="task_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $task;
}

/**
 * @ORMTable(name="tasks")
 */
class Task {
    /**
     * @var integer
     *
     * @ORMColumn(name="uid", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var integer
     *
     * @ORMColumn(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();

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

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

$em->flush($notification);

为什么教义在ManyToOne的另一边依然存在?

持久级联与此无关。例如,这仍然会更新任务:
$task = $em->getRepository("AppBundle:Task")->find(1);
$task->setStatus(1);
$em->flush();

一个常见的误解是,持久化实体意味着它在某种程度上被标记为准备更新,但事实并非如此。

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

对任何托管实体的更改都将在刷新时提交,如果实体已经被管理,则持久化不会改变这一点。

在您的任务对象的情况下,您已经使用实体管理器获取了它,因此它被认为是托管的,您对它所做的任何更新都将在刷新时提交,无论您是否对它调用persistent。

总之,如果您不希望通过全局刷新来更新托管实体,则不要更新它们,或者只对您特别希望保存到数据库的实体调用->flush。

更多信息:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#synchronization-使用数据库

相关内容

  • 没有找到相关文章

最新更新