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

エンティティの作成:あなたは教義エンティティのIDを指定しなければならない

$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がAddressオブジェクトを最初に保持する必要があるため、Userオブジェクトの外部キー関係&の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

次のようになります。

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; 
} 
関連する問題