0

当我尝试保存订单实体时,出现以下错误:

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

?

4

2 回答 2

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 时遇到了这个确切的问题。

于 2012-06-07T12:05:08.613 回答
1

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

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

$package->setOrder($this);

给我的二传手。

其次 - 您不能将两个引用列都定义为严格非 NULL。所以,我已经将 package_id 库尔姆重新定义为 null,它成功了。

于 2012-06-08T04:26:12.660 回答