Bonjour à tous,
Cela fait maintenant des heures et des heures que je tente de persister une entité sans y parvenir, j'ai l'impression d'avoir tout essayé ...
Pour faire simple, j'ai une entité "CleVersion" :
class CleVersion
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="LogicielBundle\Entity\CleVersionLot", mappedBy="cleVersion", cascade={"persist"})
*/
private $lots;
...
Jusque la, pas de soucis. Ensuite, comme vous l'avez vu, j'ai une entité "CleVersionLot" :
class CleVersionLot
{
/**
* @ORM\Id()
* @ORM\ManyToOne(targetEntity="LogicielBundle\Entity\CleVersion", inversedBy="lots")
* @ORM\JoinColumn(name="cle_version_id", referencedColumnName="id")
*/
private $cleVersion;
/**
* @ORM\Id()
* @ORM\ManyToOne(targetEntity="LogicielBundle\Entity\Lot")
* @ORM\JoinColumn(name="lot_id", referencedColumnName="id")
*/
private $lot;
...
Comme vous pouvez le voir, cette entité à sa propre clé composée. En fait, il s'agit d'un "ManyToMany" créé manuellement car il y a d'autres champs. J'ai volontairement retiré les get(), set(), add() et remove() pour ne pas alourdir le code sur le forum, néanmoins ils fonctionnent correctement.
J'ai créé un formulaire qui s'affiche bien et qui envoi correctement toutes les données une fois validé :
$form = $this->createForm('logiciel_cle_form', $cle);
$this->submit($form);
if ($form->handleRequest($request)->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($cle);
$em->flush();
...
Lorsque je fais un dump($cle) juste avant le flush(), la totalité de l'arbre s'affiche bien, ce qui semble signifier que les get() et set() sont bien construits. Cependant, j'ai cette erreur :
** Entity of type LogicielBundle\Entity\CleVersionLot has identity through a foreign entity LogicielBundle\Entity\CleVersion, however this entity has no identity itself. You have to call EntityManager#persist() on the related entity and make sure that an identifier was generated before trying to persist 'LogicielBundle\Entity\CleVersionLot'. In case of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call EntityManager#flush() between both persist operations. **
Je comprends bien le problème, lorsqu'il tente d'insérer la clé composée il y a une erreur, mais le "cascade" devrait justement prévenir ce genre d'erreur ... sur certains forums ils recommandent de ne pas mettre la clé composée et de mettre tout simplement un ID(), mais cette solution contournée ne me plait vraiment pas.
Si quelqu'un a une solution ...
Merci beaucoup :)