2012-06-07 74 views
0

我得到folowwing错误,当我尝试保存我的订单实体:保存onetoone关系实体

完整性约束违规:1048列“的package_id”不能为空。

简体实体:

class Order 
    { 

     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="IDENTITY") 
     */ 
     protected $id;   

     /** 
     * @ORM\OneToOne(targetEntity="DeliveryPackage",inversedBy="order", cascade={"persist"}) 
     * @ORM\JoinColumn (name="package_id", referencedColumnName="id") 
     */ 
     protected $package; 

     /** 
     * @ORM\ManyToOne(targetEntity="User",cascade={"persist"}) 
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
     */ 
     protected $user; 

    public function setId($id) 
    { 
     $this->id = $id; 
    } 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setPackage($package) 
    { 
     $this->package = $package; 
    } 

    public function getPackage() 
    { 
     return $this->package; 
    } 
} 

class DeliveryPackage 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToOne(targetEntity="Order",mappedBy="deliverypackage",cascade={"persist"}) 
    * @ORM\JoinColumn (name="order_id", referencedColumnName="id")  
    */ 
    protected $order;  

    public function setId($id) 
    { 
     $this->id = $id; 
    } 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setOrder($order) 
    { 
     $this->order = $order; 
    } 

    public function getOrder() 
    { 
     return $this->order; 
    } 

} 

主要的一点是,这两个实体都是新的。所以他们还没有身份证。是否有任何选项,可以同时保存两者

$em->persist($order); 
$em->flush(); 

回答

3

一旦关系已经建立,您需要坚持它们。尝试改变订单:: setPackage以下几点:

public function setPackage($package) 
{ 
    $this->package = $package; 
    $package->setOrder($this); 
} 

然后建立关系之前坚持:

$order = new Order(); 
$package = new Package(); 
$order->setPackage($package); 
$em->persist($order); 
$em->flush(); 

的我想你会发现,然后它工作正常。当我第一次玩Doctrine 2时,遇到了这个问题。

+0

Thx,你的回答帮助我解决了这个问题。 :) – fperet

1

解决方案部分基于前面的答案,但仍不足以解决问题。

所以有2个动作要做。 首先 - 添加

$package->setOrder($this); 

我的二传手。

第二 - 不能将两个引用列定义为严格不为NULL。所以,我已经将package_id coulmn重新定义为null,并且它解决了。