Symfony 使用OneToMany关联保留条令实体时出错
使用cascade persist的集合中的新实体将生成异常并回滚flush()操作。原因是“UserGroupPrivilege”实体通过外部实体“UserGroup”具有标识 但是,如果“UserGroupPrivilege”有自己的标识和自动生成的值,那么代码就可以正常工作,我不希望该标识成为强制验证的复合键。这是我的密码: 实体用户组:Symfony 使用OneToMany关联保留条令实体时出错,symfony,doctrine-orm,doctrine,symfony-2.3,Symfony,Doctrine Orm,Doctrine,Symfony 2.3,使用cascade persist的集合中的新实体将生成异常并回滚flush()操作。原因是“UserGroupPrivilege”实体通过外部实体“UserGroup”具有标识 但是,如果“UserGroupPrivilege”有自己的标识和自动生成的值,那么代码就可以正常工作,我不希望该标识成为强制验证的复合键。这是我的密码: 实体用户组: class UserGroup { /** * @var integer * * @ORM\Column(type
class UserGroup
{
/**
* @var integer
*
* @ORM\Column(type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(type="boolean", nullable=false)
* @Type("integer")
*/
private $active;
/**
* @ORM\OneToMany(targetEntity="UserGroupPrivilege", mappedBy="userGroup", cascade={"persist"})
*/
private $privileges;
实体用户组权限:
class UserGroupPrivilege
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(type="integer", nullable=false)
*
*/
private $privilegeId;
/**
* @var UserGroup
*
* @ORM\Id
* @ORM\ManyToOne(targetEntity="UserGroup", inversedBy="privileges")
* @ORM\JoinColumn(name="userGroupId", referencedColumnName="id")
*/
private $userGroup;
/**
* @var string
* @ORM\Column(type="string", nullable=false)
*/
private $name;
/**
* @var string
* @ORM\Column(type="string", nullable=false)
*/
private $value;
控制器:
$userGroup = new UserGroup();
$userGroupPrivilege = new UserGroupPrivilege();
userGroupPrivilege->setUserGroup($userGroup)
->setName($arrPrivilege['name'])
->setValue($arrPrivilege['value'])
->setPrivilegeId($arrPrivilege['privilegeId']);
$userGroup->addPrivilege($userGroupPrivilege);
$data = $repo->saveUserGroup($userGroup);
return $data;
存储库:
$em = $this->getEntityManager();
$em->persist($userGroup);
$em->flush();
我得到以下错误:
Entity of type UserGroupPrivilege has identity through a foreign entity UserGroup, however this entity has no identity itself. You have to call EntityManager#persist() on the related entity and make sure that an identifier was generated before trying to persist 'UserGroupPrivilege'. In case of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call EntityManager#flush() between both persist operations.
错误消息是非常自解释的。要将
UserGroupPrivilege
与UserGroup
关联,UserGroup
必须设置其ID。然而,由于您刚刚创建了这两个实体,所以它并没有id,因为它还并没有被持久化到数据库中
就你而言:
$em = $this->getEntityManager();
$em->persist($userGroup);
$em->persist($userGroupPrivilege);
$em->flush();
您能否使用唯一约束“强制验证”:
/**
* @Entity
* @Table(uniqueConstraints={@UniqueConstraint(name="ugppriv_idx", columns={"priviledgeId", "userGroup"})})
*/
class UserGroupPriviledge
{
...