2013-08-09 11 views
5

私はOneToOneを一方向にマップする2つのエンティティ(UserとUserPreferences)を持っています。新しいユーザーが作成されたときにDoctrine2.3とOneToOneのカスケード・サスペンドが機能しないようです。

/** 
* @ORM\Table("users") 
* @ORM\Entity 
*/ 
class User 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    */ 
    protected $id; 

    ... 

    /** 
    * @ORM\Column(name="user_preferences_id", type="integer") 
    * @ORM\OneToOne 
    * (
    *  targetEntity="UserPreferences", 
    *  cascade={"persist"} 
    *) 
    */ 
    protected $userPreferences; 

    public function __construct() { 
     $this->userPreferences = new UserPreferences(); 
    } 
} 


/** 
* @ORM\Table("user_preferences") 
* @ORM\Entity 
*/ 
class UserPreferences extends UserPreferencesEntity 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="user_id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    ... 
} 

は今、のUserPreferencesが新しいのUserPreferencesオブジェクトで初期化されます。

のコードは次のようになります。 userを持続しようとすると、Doctrineは

A new entity was found through the relationship '...\Entity\User#userPreferences' that was not configured to cascade persist operations for entity: ...\Entity\[email protected] To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).

を主張し、例外がスローされます。しかし、私は他に何をすべきでしょうか? User#userPreferencesはpersistをカスケードするように設定されていますが、そうではありません。私はここで何か間違っていますか?

+0

アノテーションプロパティなしで試しましたか? – Flosculus

+0

アノテーションなしのプロパティ? – dwalldorf

答えて

6

OK]をクリックして解決策が見つかりました:私はmappedByとinversedBy指定する必要がありましたすべての

/** 
* User 
* 
* @ORM\Table("users") 
* @ORM\Entity 
*/ 
class User extends UserEntity 
{ 
    ... 

    /** 
    * @ORM\OneToOne 
    * (
    *  targetEntity="UserPreferences", 
    *  cascade={"persist", "remove"}, 
    *  inversedBy="user" 
    *) 
    */ 
    protected $userPreferences; 
} 

/** 
* @ORM\Table("user_preferences") 
* @ORM\Entity 
*/ 
class UserPreferences extends UserPreferencesEntity 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @var int 
    * 
    * @ORM\OneToOne(targetEntity="User", mappedBy="id", cascade={"persist", "remove"}) 
    */ 
    protected $user; 

    ... 
} 

まず(私はすでに前に試みたが、間違った方向に - 所有している側のmappedBy、inversedByで反転する側)。また、逆の側は別のIDを持つ必要がないと思って、私は所有サイドのID(User#id)もこのプライマリキーとして使用しようとしました。

+0

mappedBy = "id"とは何ですか? –

+0

'* @ORM \ Column(name =" user_preferences_id "、type =" ")の代わりに' * @ORM \ JoinColumn(name = "user_preferences_id"、referencedColumnName = "id")の代わりに 'targetEntity'のIDは – dwalldorf

0

バグは、あなたのコードは、これに代えて

* @ORM\JoinColumn(name="user_preferences_id", referencedColumnName="id") 

が含まれている必要があり

* @ORM\Column(name="user_preferences_id", type="integer") 

していました。

+0

です。整数 ")' – Edward

関連する問題