保存onetoone关系实体

时间:2012-06-07 11:49:09

标签: symfony doctrine-orm

当我尝试保存我的订单实体时,我遇到了错误:

完整性约束违规: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;
    }   

}

重点是两个实体都是新的。所以他们还没有id。有没有选择,用

保存它们
$em->persist( $order );
$em->flush();

2 个答案:

答案 0 :(得分:3)

一旦已建立关系,您需要保留它们。尝试将Order :: 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时遇到了这个问题。

答案 1 :(得分:1)

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

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

$package->setOrder($this);

到我的二传手。

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

相关问题