42 votos

Explícitamente Identificador de conjunto de la Doctrina cuando se utiliza "AUTO" estrategia

Mi entidad utiliza esta anotación para su ID:

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

A partir de una base de datos limpia, me voy a importar en los registros existentes a partir de una base de datos anterior y tratando de mantener el mismo Id. Entonces, cuando la adición de nuevos registros, quiero MySQL para incrementar automáticamente el ID de columna como de costumbre.

Por desgracia, parece que Doctrine2 ignora por completo el ID especificado.


Nueva Solución

Por recomendaciones que figuran a continuación, la siguiente es la solución preferida:

$this->em->persist($entity);

$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());

Viejo Solución

Porque la Doctrina pivotes de la ClassMetaData para determinar el generador de estrategia, tiene que ser modificado después de la administración de la entidad en el EntityManager:

$this->em->persist($entity);

$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);

$this->em->flush();

Acabo de probar esto en MySQL y funcionó como se esperaba, el significado de Entidades con un ID personalizado fueron almacenados con ese ID, mientras que aquellos sin un ID especificado se utiliza la lastGeneratedId() + 1.

21voto

nicolasbui Puntos 221

A pesar de que su solución funciona bien con MySQL, no he logrado hacer que funcione con PostgreSQL como Es basada en la secuencia.

Tengo que añadir esta línea para hacer funcionar a la perfección :

$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());

Saludos cordiales,

16voto

forgottenbas Puntos 5254

Tal vez lo que la doctrina ha cambiado, pero ahora de manera correcta es:

$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());

3voto

Weregoat Puntos 29

En caso de que la entidad es parte de una tabla de clase de la herencia que usted necesita para cambiar el id-generador en la clase de metadatos para ambas entidades (la entidad a la que la persistencia y la raíz de la entidad)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X