2017-06-29 36 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; 
}