2017-01-20 3 views
0

J'ai l'application Symfony 2.6 et j'utilise doctrine-odm-bundle 3.0.2 (doctrine-odm: 1.1.2, mongodb: 1.4.0). Dans les attributs et lorsque je crée une nouvelle instance de celui-ci, remplissez les champs et persistez - cela se passe bien au début. Je peux créer quelques documents presque vides, avec des documents référencés ou non et ça marche bien. À un certain moment, je suis en train d'ajouter nouvel élément dans la base de données et d'obtenir une erreur:La persistance d'un document arrête brusquement de renvoyer la valeur de l'identificateur suivant (ALNUM strategry)

E11000 duplicate key error collection: test.Product index: _id_ dup key: { : 0 } 

Le message est clair - je peux voir qu'il y avait un document ajouté à la collection avec id = 0, donc deuxième ne peut pas aller -> dupliquer l'entrée. Mais pourquoi il commence soudainement à retourner "0" pour id? Même si, j'ai vérifié doctrine_increment_ids collection - compteur pour id est incrémenté. Mais $product->getId() devient "0" après persister.

Si je supprime la base de données et recommence à zéro - cela fonctionne, je peux toujours ajouter de nouveaux produits dans la collection. Disons que j'ai créé avec succès 12 produits. Création du 13ème résultat: un document avec id = 0 étant conservé dans la collection. 14ème échoue avec erreur en double.

Pouvez-vous s'il vous plaît aider à dépanner ou suggérer une idée où ça va mal? PS> Je ne considère pas une mise à niveau de Symfony2 (à ce stade) ni comme doctrine-odm-bundle (cela dépend aussi de Symfony2 plus récent) - les efforts de migration sont assez élevés et je ne suis pas sûr que cela corrigera problème. D'abord je veux découvrir la cause première.

// Document Product 

/** 
* @MongoDB\Document 
* @MongoDB\HasLifecycleCallbacks 
*/ 
class Product 
{ 
    /** @MongoDB\Id(strategy="ALNUM", type="int") */ 
    protected $id; 

    /** 
    * @Gedmo\ReferenceOne(type="entity", class="Entity\User", inversedBy="products", identifier="userId") 
    */ 
    protected $user; 

    /** 
    * @MongoDB\Field(name="user_id", type="int") 
    */ 
    protected $userId; 

    /** 
    * @MongoDB\ReferenceMany(
    *  targetDocument="Picture", 
    *  discriminatorMap={"file" = "File", "picture" = "Picture"}, 
    *  discriminatorField="discr", 
    *  defaultDiscriminatorValue="picture" 
    *) 
    * @Assert\Valid 
    */ 
    protected $pictures; 

    ... 
} 

// Entity User 

/** 
* User entity 
* @ORM\Entity 
* @ORM\Table(name="users") 
*/ 
class User 
{ 

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

    /** 
    * @var ArrayCollection $textures 
    * 
    * @Gedmo\ReferenceMany(type="document", class="Document\Product", mappedBy="user") 
    */ 
    protected $products; 
    ... 
} 

// Document Picture 

/** 
* @MongoDB\Document 
* @MongoDB\InheritanceType("SINGLE_COLLECTION") 
* @MongoDB\DiscriminatorField("discr") 
* @MongoDB\DiscriminatorMap({"file" = "File", "picture" = "Picture"}) 
* @MongoDB\DefaultDiscriminatorValue("picture") 
* @MongoDB\HasLifecycleCallbacks 
*/ 
class Picture 
{ 

    /** 
    * 
    * @MongoDB\Id(strategy="ALNUM", type="int") 
    */ 
    protected $id; 

    /** 
    * @MongoDB\ReferenceOne(targetDocument="Product") 
    * 
    * @var Product $product 
    */ 
    protected $product; 
    ... 
} 

Répondre

0

La lecture de documentation est toujours utile (stratégies de génération). En fait, juste strategy="ALNUM" et type="int" ne peut pas aller ensemble :)

changement de stratégie à INCREMENT et de supprimer type = « int » si vous voulez avoir des entiers dans votre _id. Ou vous pouvez modifier tapez à chaîne pour continuer avec _id étant une chaîne alphanumérique.