原则 2:双向关系,在不拥有的情况下添加实体不会持续存在

Posted

技术标签:

【中文标题】原则 2:双向关系,在不拥有的情况下添加实体不会持续存在【英文标题】:Doctrine 2: bi-directional relation, Adding entity on not owning will not persist 【发布时间】:2012-08-22 10:28:28 【问题描述】:

原则 2:双向关系,在不拥有的情况下添加实体不会持久

class AuthRole

    /**
     * @ORM\OneToMany(targetEntity="AuthUser", mappedBy="role", cascade="persist","detach")
     * @ORM\JoinColumn(name="role_id", referencedColumnName="id")
     */
    private $authUsers;

AuthRole 是非拥有方

class AuthUser 

    /**
    * @ORM\ManyToOne(targetEntity="AuthRole", inversedBy="authUsers", cascade="persist","detach")
    * @ORM\JoinColumn(name="role_id", referencedColumnName="id")
    */
    private $role;

AuthUser 是拥有方

如果我将用户添加到角色,则不会保存关系并且 AuthUser->role 为空; 为什么会这样,这是否可以修复。

我知道,当您向用户添加角色时,关系会被保存,但这不是我想要的。

【问题讨论】:

【参考方案1】:

修改 AuthRole 实体下的 addUser 函数:

public function addAuthUser(AuthUser $authUser)

  $authUser->setAuthRole($this); // important line
  $this->authUsers[] = $authUser;

如果您使用 setter,则遍历整个数组并在每个数组上调用 setAuthRole($this)

【讨论】:

当然你可以这样做,但它是一个 hack。为什么我们能够使用级联持久化/添加到 arraycollection 如果它确实在你持久化实体时下蹲。 不,这不是 hack。你应该这样做......教义并不神奇(: :) 但是为什么我们还要为非拥有方保留一个级联。 你不知道,这在 AFAIK 文档中没有提到

以上是关于原则 2:双向关系,在不拥有的情况下添加实体不会持续存在的主要内容,如果未能解决你的问题,请参考以下文章

Salesforce.com:用户无法编辑他添加到他不拥有的帐户的注释

核心数据 - 在不触发错误的情况下获取对多关系的 objectID

最佳实践:应该避免双向关系吗? [关闭]

OneToOne 双向关系的错误映射原则

如何让实体框架在不保存对象的情况下创建/更新数据库表

如何在不删除 Sonata AdminBundle 中的实体的情况下分离关系?