我的@OneToOne关系有点问题。我使用了很多@OneToMany,而且效果很好。
我构建了最简单的@OneToOne案例:
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Lemon\RestBundle\Annotation as Rest;
/**
* @ORM\Table(name="TEST")
* @ORM\Entity
* @Rest\Resource(name="test")
*/
class Test
{
/**
* @var integer
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(name="ID", type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="CONTENT", type="string")
*/
private $content;
/**
* @ORM\OneToOne(targetEntity="Cmt", mappedBy="test", cascade={"persist"})
**/
private $cmt;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Lemon\RestBundle\Annotation as Rest;
/**
* @ORM\Table(name="CMT")
* @ORM\Entity
* @Rest\Resource(name="Cmt")
*/
class Cmt
{
/**
* @var integer
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(name="ID", type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="CONTENT", type="string")
*/
private $content;
/**
* @ORM\OneToOne(targetEntity="Test", inversedBy="cmt")
* @ORM\JoinColumn(name="test_id", referencedColumnName="id")
**/
private $test;
}
所以,我们只有一个带有一个注释Cmt的Test实体。没什么难的。
如您所见,我使用的是LemonRestBundle(使用Lemon \ RestBundle \ Annotation作为Rest)。
发送此JSON:
{
"content": "test",
"cmt": {
"content": "abcd"
}
}
在该网址上:http://localhost/web/web/app_dev.php/api/test
我发现了这个错误:
An exception occurred while executing 'INSERT INTO CMT (CONTENT, test_id) VALUES (?, ?)' with params [\"adzae\", null]:\\\n\\\nSQLSTATE[HY000]: General error: 515 General SQL Server error: Check messages from the SQL Server [515] (severity 16) [(null)]
我不知道为什么Doctrine2(或者也许是LemonRestBundle,但我真的不这么认为......)不能用TEST(ID)填充TEST_ID。这与我的@ManyToOne关系完美无缺,这就是为什么我真的对此感到困惑。
我是否需要在@OneToMany中的Test构造函数中添加一些内容?相当于:
$this->cmts = new \Doctrine\Common\Collections\ArrayCollection();
我已经检查了Doctrine2 Association Mapping,他们的@OneToOne示例完全相同。
拜托,帮助我!