0

注文エンティティを保存しようとすると、次のエラーが発生します。

整合性制約違反:1048列'package_id'をnullにすることはできません。

簡略化されたエンティティ:

    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();

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);

私のセッターに。

2番目-両方の参照列を厳密にNULLではないと定義することはできません。だから、私はpackage_id coulmnをnullとして再定義しました、そしてそれはうまくいきました。

于 2012-06-08T04:26:12.660 に答える