2017-06-29 33 views
0

我在嘗試將實體和關聯實體持久存儲到數據庫時遇到以下異常。不知道我在做什麼錯在這裏:Symfony:給定的類型實體無法添加到標識映射

例外:

The given entity of type 'AppBundle\Entity\User' 
(AppBundle\Entity\[email protected]) has no 
identity/no id values set. It cannot be added to the identity map. 

實體:

/** 
* @ORM\Entity 
*/ 
class User 
{ 
/** 
* @ORM\Column(type="string") 
*/ 
private $name; 

/** 
* @ORM\OneToOne(targetEntity="Address", inversedBy="user") 
* @ORM\JoinColumn(name="address_id", referencedColumnName="id") 
* @ORM\Id 
*/ 
protected $address; 
} 


/** 
* @ORM\Entity 
*/ 
class Address 
{ 
/** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    */ 
private $id 

/** 
* @ORM\OneToOne(targetEntity="User", mappedBy="address", cascade={"all"}, fetch="LAZY") 
*/ 
private $user; 
} 

實體創建:

$user = new User(); 
$address = new Address(); 
$address->setUser($user->setAddress($address)); 

$this->getDoctrine()->getManager()->persist($user); 
$this->getDoctrine()->getManager()->persist($address); 
$this->getDoctrine()->getManager()->flush(); 
+0

您發佈的代碼似乎不顯示User :: id? – Cerad

+0

User :: address是主鍵和外鍵。 – Freid001

+0

這不起作用。每個Doctrine實體都需要一個明確的id。 – Cerad

回答

0

請參閱:Doctrine OneToOne identity through foreign entity exception on flush這有助於解決此問題。

實際的對象地址需要先由EntityManager保存。只要將類作爲其他類的引用,不會使entityManager意識到兩個類都存在的事實。考慮到這一點,下面的代碼允許我將這些對象保存到數據庫中。我相信這是因爲Doctrine需要先保留地址對象,以便它可以檢索用戶對象中主外鍵關係的ID。

$user = new User(); 
$address = new Address(); 

$this->getDoctrine()->getManager()->persist($address); 
$this->getDoctrine()->getManager()->flush(); 

$address->setUser($user->setAddress($address)); 

$this->getDoctrine()->getManager()->persist($user); 
$this->getDoctrine()->getManager()->flush(); 
0

您必須學說實體指定ID

像這樣:

class User 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * @ORM\OneToOne(targetEntity="Address", inversedBy="user") 
    * @ORM\JoinColumn(name="address_id", referencedColumnName="id") 
    * @ORM\Id 
    */ 
    protected $address; 
}