在Doctrine2.0.6中,我不断收到错误:“Column VoucherId指定了两次”。
有问题的模型是:
篮子链接到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没有定义两次。但是,它用于映射。这就是为什么Doctrine认为这个领域是重复的?
以下是相关代码 - 我没有完整地粘贴模型,因为大部分代码都是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作为主键,但它不会自动递增。
发生的事情是以下问题之一:
如果我使用草稿订单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);
}
(这也有助于了解是否有更好的方法来检查相关实体是否存在,而不是在尝试获取值时捕获异常。)
如果我删除设置草稿订单ID的行,则会收到错误:Dpp \ DraftOrderDeliveryAddress类型的实体缺少指定的ID。
如果我保留设置草稿订单ID的行,但我删除了持久行,并且我稍后在设置名称和地址字段的代码中保留这些行,我没有收到错误 - 但数据未保存到数据库中。我在设置所有字段后使用flush() - 我只是不使用persist()。在前面的例子中,我确实使用了persist() - 我只是试着看看它是如何工作的。
如果有帮助,我可以粘贴更多代码。
答案 0 :(得分:0)
我想我已经修好了!几个发现:
对于不是自动递增值的主键,您需要使用:
@GeneratedValue(策略= “同一性”)
您还必须在第一次创建时明确设置映射实体。起初,我试图直接创建地址实体,但我没有在父模型中设置映射实体来引用地址实体。 (如果这有意义的话)
我很确定这主要是由于缺少IDENTITY关键字,由于某种原因导致该关键字没有设置,或说是设置了两次。