当我想持久化对自己有引用的实体时,我遇到了一个奇怪的问题。
数据库:
表PROJECT
具有列PARENT_ID
,该列保存对其自身的引用。
型号:
/**
* @OneToOne(targetEntity="Model_Name")
* @JoinColumn(name="PARENT_ID", referencedColumnName="ID")
**/
protected $_parentId;
代码:
$project->setParentId(int);
在设置了PARENT_ID
之后,我保持实体,并且除了PARENT_ID
之外的所有数据都存储在DB中。
编辑
Id字段/列
/**
* @Id
* @Column(type="integer", name="ID")
* @GeneratedValue(strategy="IDENTITY")
*/
protected $_id;
/**
* @return int
*/
public function getParentId()
{
return $this->_parentId;
}
/**
* @param int $parentProjectId
* @return Application_Model_Data_Project $this
*/
public function setParentId($parentId)
{
$this->_parentId = $parentId;
return $this;
}
你能发布更多的代码吗?那部分看起来很好。
这是一个工作的自参考实体的SSCCE。也许这会有所帮助。
/**
* @Entity @Table(name="messages")
**/
class Model_Message
{
/**
* @Id @Column(name="message_id",type="integer") @GeneratedValue
**/
protected $id;
/**
*@ManyToOne(targetEntity="Model_Message")
*@JoinColumn(name="parent_id", referencedColumnName="message_id")
**/
protected $parentMessage;
/**
* @OneToMany(targetEntity="Model_Message", mappedBy="parentMessage")
**/
protected $replies = array();
[...]
}
编辑
如果你想用条令保存与另一个对象的关系,你必须保存对象,而不是id。这意味着你必须设置Model_Name对象,而不能设置标记为Model_Name(targetEntity)的变量中的id(整数)。(条令将在数据库中自动使用int)。
请参阅我上面的ManyToOne示例。
/**
* @OneToOne(targetEntity="Model_Name")
* @JoinColumn(name="PARENT_ID", referencedColumnName="ID")
**/
protected $_parent;
[...]
/**
* @param Model_Name $parentProject
* @return Application_Model_Data_Project $this
*/
public function setParent($parent)
{
$this->_parent = $parent;
return $this;
}