Doctrine2.0:错误-列指定两次


Doctrine2.0: Error - Column specified twice

在Doctrine2.0.6,我一直得到一个错误:"列VoucherId指定两次"。

所讨论的模型是:

    篮子
  • BasketVoucher
  • 代金券

购物篮链接到BasketVoucher。

购物券链接到BasketVoucher。

在Voucher和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没有定义两次。但是,它在映射中使用。这就是为什么教条主义认为这个领域是重复的吗?

下面是相关的代码——我没有完整地粘贴模型,因为大部分代码都是get/set。

篮子

/**
 * @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;
}

任何想法?

编辑:我发现当我第一次保存它时,同样的问题发生在另一个模型上。我正在手动设置主键。主要问题似乎是保存实体内的关系。

在本例中,我有一个字段- DraftOrderId -它被用作三个模型的主键。第一个模型——DraftOrder——将DraftOrderId作为主键,它是一个自动递增的值。另外两个模型——DraftOrderDeliveryAddress和DraftOrderBillingAddress——也使用DraftOrderId作为主键,但它不是自动递增的。

发生的是下列问题之一:

  1. 如果我保存带有草稿订单id的送货地址实体并将其设置为持久化,则会得到一个错误:Column 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);
    }
    

(这也有助于了解是否有更好的方法来检查相关实体是否存在,而不是在试图获取值时捕获异常。)

  1. 如果我删除设置草案订单id的行,我得到一个错误:Dpp'DraftOrderDeliveryAddress类型的实体缺少分配的id。

  2. 如果我保留设置草稿订单id的行,但我删除了持久化行,并且我还保留了稍后在设置名称和地址字段的代码中的行,我不会得到错误-但数据没有保存到数据库。我在设置所有字段后使用flush() -我只是不使用persist()。在前面的例子中,我确实使用了persist()——我只是试着看看它是如何工作的。

如果有帮助的话,我可以粘贴更多的代码

我想我已经修好了!几个发现:

  • 对于不是自动递增值的主键,您需要使用:

    @generatedValue(策略="身份")

  • 您还必须在第一次创建映射实体时显式设置它们。起初,我试图直接创建地址实体,但我没有在父模型中设置映射实体来引用地址实体。(如果有意义的话)

我很确定这主要是由于缺乏IDENTITY关键字,出于某种原因,要么说关键字没有设置,要么说它设置了两次。