我有一个像这样的主键的实体:
/**
* @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;
}
答案 0 :(得分:1)
当不使用标识符生成策略时,您不应忘记在调用EntityManagers persist()方法之前必须先分配自定义ID 。
我认为您在分配自定义ID之前持久保存新实体,这意味着您的$ productId属性设置为null,如果您尝试刷新它将被转换为0(零)。这将导致您的错误。
答案 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);
现在你尝试设置数据,这是字符串 - 在你的表中是整数。