【问题标题】:SecurityContext User is not managed by EntityManager, "A new Entity was found"SecurityContext 用户不受 EntityManager 管理,“找到了新实体”
【发布时间】:2014-06-13 08:01:09
【问题描述】:

我有一个允许用户加入用户组的 ControllerAction。

UserGroup 是通过 Paramconverter 获取的,用户始终是当前登录的用户。

/*
 * @ParamConverter("code", class="StregoUserBundle:UserGroup", options={"mapping": {"code": "code"}})
 * @param \Strego\UserBundle\Entity\UserGroup $code UserGroup Code
 */
public function joinGroupAction($code){
     $userManager = $this->get('strego_user.user_manager');
     $userManager->joinGroup($code, $this->getUser());
     return new Message('Erfolgreich der Gruppe beigetreten', 'success');
}

$this->getUser 使用的是 Symfony2 Base Controller,它基本上是从 securityContext 中获取用户。

我的 joinGroup 如下所示:

public function joinGroup(UserGroup $userGroup, User $user){
    if (!$userGroup->getUsers()->contains($user)) {
        $userGroup->addUser($user);
        $this->em->merge($user);
        $this->em->persist($userGroup);
        $this->dispatcher->dispatch(
            UserEvents::USER_USERGROUP_JOIN,
            new UserGroupUserEvent($userGroup, $user)
        );
        $this->em->flush();
    }
}

如您所见,我已经尝试合并用户,但我仍然得到 以下错误消息:未捕获的 PHP 异常 Doctrine\ORM\ORMInvalidArgumentException:“找到了一个新实体 通过关系'Strego\UserBundle\Entity\UserGroup#users' 未配置为实体级联持久操作:mof。 要解决这个问题:要么显式调用 EntityManager#persist() 这个未知实体或配置级联将这个关联保持在 映射例如 @ManyToOne(..,cascade={"persist"})。"

我已经对这个问题进行了很多研究,但是所有可能的原因(不合并,em clear,使用多个em)都不适用于这种情况。

我的配置如下所示:

class UserGroup extends BaseGroup {
/**
 * @var Collection users
 * @ORM\ManyToMany(targetEntity="User", inversedBy="userGroups" )
 * @ORM\JoinTable(name="user_user_usergroup")
 * @Serialize\Expose()
 * @Serialize\MaxDepth(2)
 * @Serialize\Groups({"usergroup"})
 *
 */
protected $users;
}

class User extends BaseUser {
/**
 * @var Collection userGroups
 *
 * @ORM\ManyToMany(targetEntity="UserGroup", mappedBy="users")
 * @ORM\JoinTable(name="user_user_usergroup",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
 * )
 */
private $userGroups;
}

更新 我试图改变持久性,因为“用户”被定义为拥有方:

public function joinGroup(UserGroup $userGroup, User $user){
    if (!$userGroup->getUsers()->contains($user)) {
        $user->addUserGroup($userGroup);
        $this->em->persist($user);
        $this->dispatcher->dispatch(
            UserEvents::USER_USERGROUP_JOIN,
            new UserGroupUserEvent($userGroup, $user)
        );
        $this->em->flush();
    }
}

这会导致再次插入用户,而不是插入关系。

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    根据我们在教义文档中读到的内容,不清楚哪一方是拥有方:

    对于多对多双向关系,任何一方都可能是 拥有方(定义 @JoinTable 和/或不 使用 mappedBy 属性,因此使用默认连接表)。

    在你的情况下,用户表定义了连接表,但也声明了属于拥有方的“mappedBy”属性,而不是所有者。

    您确定该用户始终是经过身份验证的用户,因此该用户存在于数据库中吗?

    又瘦了,看完这里:http://docs.doctrine-project.org/en/2.1/cookbook/entities-in-session.html 那是:

    一个常见的错误是没有从 EntityManager#merge() 的返回值中获取合并的用户对象。传递给 merge 的实体对象不一定与方法返回的对象相同。

    所以在第一个例子中:

        $this->em->merge($user);
    

    应该变成

    $user = $this->em->merge($user);
    

    【讨论】:

    • 我用我的映射更新了我的问题,我正在映射多对多
    • 成功了,非常感谢。我从几个小时以来一直在调试这个并且变得疯狂。
    猜你喜欢
    • 2011-08-22
    • 2012-03-02
    • 2010-11-21
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多