[英]Error when persisting doctrine entity with OneToMany association
使用級聯持久化的集合中的新實體將產生異常並回滾flush()操作。 原因是“ UserGroupPrivilege”實體通過外部實體“ UserGroup”具有身份。
但是,如果“ UserGroupPrivilege”具有自己的身份以及自動生成的值,則代碼可以正常工作,並且我不希望我將身份用作執行驗證的復合鍵。 這是我的代碼:
實體用戶組:
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;
實體UserGroupPrivilege:
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
{
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.