2011-07-20 9 views
0

Doctrine2.0.6では、「Column VoucherIdが2回指定されました」というエラーが発生します。問題のDoctrine2.0:エラー - 2回指定された列

モデルは以下のとおりです。

  • バスケットBasketVoucherへ
  • BasketVoucher
  • クーポン

バスケットリンク。

バウチャーはBasketVoucherにリンクしています。

バウチャーとBasketVoucherには、VoucherIdというフィールドがあります。これは両方のモデルで定義され、両方のDBテーブルに同じ名前で存在します。新しいBasketVoucherレコードを保存するとき

エラーが発生します。

$basketVoucher = new BasketVoucher; 
$basketVoucher->setVoucherId($voucherId); 
$basketVoucher->setBasketId($this->getBasket()->getBasketId()); 
$basketVoucher->setCreatedDate(new DateTime("now")); 
$em->persist($basketVoucher); 
$em->flush(); 

私はモデルをチェックしましたし、VoucherIdが二度定義されていません。ただし、マッピングで使用されます。 Doctrineがフィールドが重複していると思うのはなぜですか?

ここに関連するコードがあります。ほとんどのコードが取得/設定されるため、モデル全体を貼り付けていません。

バスケット

/** 
* @OneToMany(targetEntity="BasketVoucher", mappedBy="basket") 
* @JoinColumn(name="basketId", referencedColumnName="BasketId") 
*/ 
private $basketVouchers; 

public function getVouchers() 
{ 
    return $this->basketVouchers; 
} 

BasketVoucher

/** 
* @ManyToOne(targetEntity="Basket", inversedBy="basketVouchers") 
* @JoinColumn(name="basketId", referencedColumnName="BasketId") 
*/ 
private $basket; 

public function getBasket() 
{ 
    return $this->basket; 
} 

/** 
* @OneToOne(targetEntity="Voucher", mappedBy="basketVoucher") 
* @JoinColumn(name="voucherId", referencedColumnName="VoucherId") 
*/ 
private $voucherEntity; 

public function getVoucher() 
{ 
    return $this->voucherEntity; 
} 

クーポン

/** 
* @OneToOne(targetEntity="BasketVoucher", inversedBy="voucherEntity") 
* @JoinColumn(name="voucherId", referencedColumnName="VoucherId") 
*/ 
private $basketVoucher; 

public function getBasketVoucher() 
{ 
    return $this->basketVoucher; 
} 

任意のアイデア?

EDIT:初めて別のモデルで同じ問題が発生することが判明しました。プライマリキーを手動で設定しています。主な問題は、エンティティ内の関係を保存することです。

この場合、3つのモデルでプライマリキーとして使用されるDraftOrderIdフィールドがあります。最初のモデルDraftOrderは、DraftOrderIdを主キーとして持ちます。これは自動インクリメント値です。他の2つのモデルDraftOrderDeliveryAddressとDraftOrderBillingAddressも、DraftOrderIdを主キーとして使用しますが、自動増分されません。私はエラーを取得し、ドラフト注文IDと配信アドレスエンティティを保存し、それが持続するように設定した場合

  1. :何が起こっている

    は、次の問題の一つである列が2回指定DraftOrderId。コード:

    try { 
        $addressEntity->getDraftOrderId(); 
    } catch (\Doctrine\ORM\EntityNotFoundException $e) { 
        if ($addressType == "delivery") { 
         $addressEntity = new Dpp\DraftOrderDeliveryAddress; 
        } elseif ($addressType == "billing") { 
         $addressEntity = new Dpp\DraftOrderBillingAddress; 
        } 
        $addressEntity->setDraftOrderId($draftOrder->getDraftOrderId()); 
        $em->persist($addressEntity); 
    } 
    

(それはまた、関連するエンティティではなく値を取得しようとしたときに例外を捕捉するよりも、存在するかどうかをチェックするのより良い方法がありますかどうかを知るために役立つだろう。私はドラフト注文IDを設定する行を削除した場合)

  1. 、私はエラーを取得:タイプDppと\ DraftOrderDeliveryAddressのエンティティは、割り当てられたIDが欠落しています。

  2. ドラフト注文IDを設定する行を保持していても、永続化行を削除しても、名前とアドレスフィールドを設定するコードで後でその行を保持すると、エラーは発生しません - データはデータベースに保存されません。私はすべてのフィールドを設定した後にflush()を使用しています - 私は単にpersist()を使用していません。前の例では、persist()を使用しています。これがどのように機能するか見てみることです。

さらに役立つコードを貼り付けることができます。

答えて

0

私はそれを修正したと思います!調査結果のカップル:自動インクリメント値ではありません主キーの

  • 、あなたが使用する必要があります。

    @GeneratedValue(戦略= "IDENTITY")

  • あなたも初めてマッピングされたエンティティを明示的に設定する必要があります。最初は、アドレスエンティティを直接作成しようとしていましたが、親エンティティ内のマッピングエンティティをアドレスエンティティを参照するように設定していませんでした。

私はそれが何らかの理由のためだったIDENTITYキーワードの欠如にほとんどだったかなり確信している(つまり、すべての理にかなっている場合)のいずれかのキーが設定されていないと言って、またはそれが設定されたと言って二度。

関連する問題