2015-01-26 51 views
1

我有一个在__construct函数上生成的具有自定义id(即UUID)的实体。Symfony2:Sonata实体中的自定义标识符

namespace AppBundle\Entity; 
use Rhumsaa\Uuid\Uuid; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class Person 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="string") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    public function __construct() 
    { 
     $this->id = Uuid::uuid4()->toString(); 
    } 

此实体用于奏鸣曲和项目的其他部分。我需要这个实体在持久化和刷新之前拥有id,所以我不能使用自动增量。

所以,问题是奏鸣曲不要让我创建实体,因为它需要创建选项作为编辑执行,因为该实体已经有一个ID,但此时这个实体不存在,因此失败。

问题不在于生成UUID的库,“id”的任何值都失败。

任何人都知道如何解决它?另一种类似的方法来解决问题?

+0

你能展示一些代码来澄清你的意思吗? – Kmeixner 2015-01-26 21:42:45

+0

我编辑了这个问题。 – 2015-01-26 22:03:05

回答

0

你不应该在构造函数中设置你的id,而应该使用prePersist Doctrine事件来改变你的实体,然后再坚持它。

您可以使用批注执行此操作,请参阅the Doctrine Documentation on prePersist

在构造函数中设置id的问题是,当您从数据库中检索它时可能会覆盖它,在这种情况下它将不正确。

+0

该实体还用于非Sonata代码,并且在将其持久保存到数据库之前,我需要有一个ID。如何解决它? – 2015-01-27 12:47:38

+0

为什么在坚持它之前你需要这个ID?只坚持它?在这种情况下,prePersist会预先填写它。否则,如果是为了管理关系,我建议您只有在实体持续存在时才能检索ID。 – 2015-01-28 10:56:53

+0

用于测试目的。例如,我有一个服务,记录日志ID:$ this-> logger-> info(“Person:”。$ person-> getId());我不想坚持并冲洗那个实体,因为它花了很多时间,我不想在这个测试中注入真正的实体管理者,只是一个模拟。 – 2015-01-28 11:07:59

相关问题