2013-08-09 13 views
5

Tôi có hai entites (User và UserPreferences) mà tôi muốn ánh xạ OneToOne một chiều.Doctrine2.3 và OneToOne thác liên tục dường như không hoạt động

Mã này trông giống như sau:

/** 
* @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; 

    ... 
} 

Bây giờ khi một người dùng mới được tạo ra, userPreferences được khởi tạo với một UserPreferences mới phản đối. Khi cố gắng để tồn tại user, Doctrine ném một ngoại lệ, tuyên bố

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"}).

Nhưng điều gì khác tôi nên làm gì? User userPreferences của người dùng được cấu hình để xếp hàng tồn tại nhưng không. Tôi nhận được một cái gì đó sai ở đây?

+0

Bạn đã thử nó mà không có thuộc tính chú thích đó chưa? – Flosculus

+0

Nếu không có thuộc tính chú thích nào? – dwalldorf

Trả lời

6

Ok tìm thấy giải pháp:

/** 
* 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; 

    ... 
} 

Trước hết tôi phải chỉ định mappedBy và inversedBy (mà tôi đã cố gắng trước đây nhưng theo hướng sai - mappedBy ở phía bên sở hữu, inversedBy ở bên cạnh đảo ngược;). Ngoài ra tôi nghĩ rằng bên inversed không cần phải có một id riêng biệt và tôi đã cố gắng sử dụng id của bên sở hữu (User # id) là khóa chính cho điều này quá.

+0

Điểm mappedBy = "id" nào? –

+0

Id của 'targetEntity' – dwalldorf

0

Bug là với

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

Mã của bạn nên chứa

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

thay vì điều này.

+0

thay vì những gì – Edward

+1

' * @ORM \ JoinColumn (name = "user_preferences_id", referencedColumnName = "id") 'thay vì' * @ORM \ Column (name = "user_preferences_id", type = " số nguyên ")' – Daniel