Partage
  • Partager sur Facebook
  • Partager sur Twitter

Relation many to many

    22 octobre 2010 à 13:58:45

    Bonjour!

    J'ai deux entity mappé en manytomany:

    public class EntityA implements Serializable {
    
    	   
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int a_id;
    	@ManyToMany(mappedBy="a")
    	protected Set<EntityB> b;
    ...
    }
    
    public class EntityB implements Serializable {
    
    	   
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int b_id;
    @ManyToMany
    	@JoinTable(name="b-a",
    			joinColumns=@JoinColumn(name="ci_b_id",referencedColumnName="b_id"),
    			inverseJoinColumns= @JoinColumn(name="ci_a_id", referencedColumnName="a_id"))
    			protected Set<EntityA> a;
    



    Et en bd j'ai donc trois tables: celle de EntityA, de EntityB et b-a.

    Apres je fais:

    Set<EntityB> liste=new HashSet<EntityB>();
    
    EntityB imaginarium = new EntityB(...);
    liste.add(imaginarium);
    
    EntityA a = new EntityA(liste, ...); // liste permet de remplir le Set<EntityB> b
    entityManager.persist(a);
    


    Cela me cree bien dans les tables des entités les ajout, mais par contre la table b-a reste vide...
    Comment puis-je la remplir automatiquement?

    Merci de votre aide!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      22 octobre 2010 à 14:17:57

      Salut,

      C'est parce que c'est EntityB qui "dirige" la relation (@ManyToMany(mappedBy="a") ).

      Met plutôt un @ManyToMany(mappedBy="b") sur l'attribut a de EntityB.
      • Partager sur Facebook
      • Partager sur Twitter
        22 octobre 2010 à 15:17:21

        Merci bien c'était ça!

        J'ai un autre souci, c'est que si je fais plsuieurs fois entityManager.persist(a);, cela me rajoute autan de ligne identique dans les tables concernés. Comment puis-je faire pour qu'il ne me rajoute pas de doublon?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          22 octobre 2010 à 16:53:42

          C'est parce qu'après un persist, l'id n'est pas mis à jour. Un deuxième persist trouvera un id null et conclura à une une nouvelle instance.

          Extrait d'un forum :

          Citation

          After you persist the entity, call em.refresh(account).

          This forces the persistence layer to generate the ID for the entity. That
          is, it responds as if the entity had been committed to the database. Note
          that the entity will not physically exist in the database until you commit
          the transaction. (I'm assuming your code is part of a transaction.)


          Donc, si tu fais un refresh, un nouveau persist devrait a priori lancer une EntityExistsException.


          PS : Je ne suis pas tout à fait sûr de moi. C'est à vérifier.
          • Partager sur Facebook
          • Partager sur Twitter

          Relation many to many

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown