ORM和Symfony2的完整性约束违规1062

时间:2014-11-03 11:57:31

标签: php mysql symfony orm entity

我有一个像这样的主键的实体:

 /**
 * @var integer
 *
 * @ORM\Column(name="product_id", type="integer", nullable=false)
 * @ORM\Id     
 */
protected $productId;

....

/**
 * Set productId
 *
 * @param integer $productId
 * @return Products
 */
public function setProductId($productId)
{
    $this->productId = $productId;

    return $this;
}

/**
 * Get productId
 *
 * @return integer 
 */
public function getProductId()
{
    return $this->productId;
}    

但是当我尝试使用set方法插入ProductId时,我收到此错误:

  

完整性约束违规1062重复条目'0'用于密钥'primary'

我试过* @ORM \ GeneratedValue(strategy =“NONE”),但结果是一样的,我需要设置产品ID,因为序列不是1,2,3 ......不同。 / p>

我无法创建新的ID,因为我的当前ProductId被Foreing Keys等其他实体使用。

任何解决方案? 提前谢谢。

-----使用我有错误的文件编辑-----

$prod = new Products();
$prod->setProductId("65");
$manager->persist($prod);
$manager->flush(); 

----用整个实体编辑----

命名空间My \ WebBundle \ Entity;

将Doctrine \ ORM \ Mapping用作ORM;

class Products
{
/**
 * @var integer
 *
 * @ORM\Column(name="product_id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="NONE")
 */
protected $productId;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=50, nullable=false)
 */
private $name;

/**
 * @var integer
 *
 * @ORM\Column(name="version", type="integer", nullable=true)
 */
private $version;

 /**
 * @var string
 *
 * @ORM\Column(name="code", type="string", length=10, nullable=false)
 */
private $code;

/**
 * @var integer
 *
 * @ORM\Column(name="price", type="integer", nullable=false)
 */
private $price;

 /**
 * Set productId
 *
 * @param integer $productId
 * @return Products
 */
public function setProductId($productId)
{
    $this->productId = $productId;

    return $this;
}

/**
 * Get productId
 *
 * @return integer 
 */
public function getProductId()
{
    return $this->productId;
}    

/**
 * Set name
 *
 * @param string $name
 * @return Products
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}

/**
 * Set version
 *
 * @param integer $version
 * @return Products
 */
public function setVersion($version)
{
    $this->version = $version;

    return $this;
}

/**
 * Get version
 *
 * @return integer 
 */
public function getVersion()
{
    return $this->version;
}

/**
 * Set code
 *
 * @param string $code
 * @return Products
 */
public function setCode($code)
{
    $this->code = $code;

    return $this;
}

/**
 * Get code
 *
 * @return string 
 */
public function getCode()
{
    return $this->code;
}
/**
 * Set price
 *
 * @param integer $price
 * @return Products
 */
public function setPrice($price)
{
    $this->price = $price;

    return $this;
}

/**
 * Get price
 *
 * @return integer
 */
public function getPrice()
{
    return $this->price;
}

2 个答案:

答案 0 :(得分:1)

当不使用标识符生成策略时,您不应忘记在调用EntityManagers persist()方法之前必须先分配自定义ID

我认为您在分配自定义ID之前持久保存新实体,这意味着您的$ productId属性设置为null,如果您尝试刷新它将被转换为0(零)。这将导致您的错误。

Doctrine Doc

答案 1 :(得分:0)

马库斯对你的问题给出了一个很好的答案。您可以通过向您的Entity添加id来解决它,并使用productId作为辅助密钥。

添加ID并将其设置为自动增量,如

/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

然后您可以将productId用于:

 /**
 * @var integer
 *
 * @ORM\Column(name="product_id", type="integer", nullable=false)    
 */
protected $productId;

使用此解决方案,您将使用$ productId作为辅助密钥。不要忘记清除表格中的数据。

你在这里也有错误:

$prod->setProductId(65);

现在你尝试设置数据,这是字符串 - 在你的表中是整数。