IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

Probleme de mis a jour ManyToMany [EJB3 Entity]


Sujet :

Java EE

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Probleme de mis a jour ManyToMany
    Bonjour,

    dans le cadre d'un développement Web sous Netbeans :
    EJB / JSF / Facelets / Glassfish.
    j'ai un problème de liaison entre 2 tables (ManyToMany):
    t_bookmarks n<>n t_tags

    Je me suis aidé de ce topic :
    http://www.developpez.net/forums/sho...ght=ManyToMany

    mon problème se produit lors d'un ajout d'un bookmark, j'entre un bookmark dans un formulaire, je valide par un bouton "add" et je me retrouve dans mon bean.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public class BookmarksManagementBean 
    {
        @EJB
        private BookmarksFacadeLocal bookmarkFacade;
     
        private long id; // Primary key
        private String url;
        protected Collection<Tags> tags;
     
        public String addBookmark()
        {
            Bookmarks b = new Bookmarks();
            Tags t = new Tags();
            ArrayList al = new ArrayList();
     
            // init new bookmark with forms
            b.setUrl(url);
            b.setTags(tags);
     
            // init new tag with static data
            t.setName("informatique");
     
            al.add(t.getBmks());
            t.setBmks(al);
     
            al = null;
            al = new ArrayList();
            al.add(t);
            tags = al;
            b.setTags(tags);
     
            // insert data in database (t_bookmarks and t_tags)
            bookmarkFacade.create(b);
       }
    (...)
    }
    mon bean utilise la session "bookmark" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Stateless
    public class BookmarksFacadeBean implements BookmarksFacadeLocal 
    {
        @PersistenceContext
        private EntityManager em;
     
        public void create(Bookmarks bookmarks)
        {
            em.persist(bookmarks);
        }
    (...)
    }
    et ma session utilise l'"entity class" suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    @Entity
    @Table(name="t_bookmarks")
    public class Bookmarks implements Serializable 
    {
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id; // Primary key
     
        @Column(name = "url", unique = true, updatable = false, nullable = false, length = 256)
        private String url;
     
        @ManyToMany(cascade={CascadeType.PERSIST}, mappedBy="bmks")
        protected Collection<Tags> tags;
     
    (...)getter() and setter()(...)
    }
    Entity class "Tags" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    @Entity
    @Table(name="t_tags")
    public class Tags implements Serializable 
    {
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id; // Primary key
     
        @Column(name = "name", unique = true, updatable = false, nullable = false, length = 64)
        private String name;
     
        @ManyToMany(cascade={CascadeType.PERSIST})
        protected Collection<Bookmarks> bmks;
    (...)getter() and setter()(...)
    }
    En résumé:
    • je n'ai aucun message d'erreur sous l'explorateur et sous les logs.
    • l'insertion s'effectue normalement dans la table "t_bookmarks".
    • la collection de tags s'ajoute normalement aussi dans la table "t_tags".


    Le problème :

    • L'INSERTION DANS MA TABLE JOINTURE "t_bookmarks_t_tags" NE S'EFFECTUE PAS !


    Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Le problème est résolu pour l'ajout de nouvelles données dans ma table de jointure.

    Voir le code corrigé ci-dessous :

    Entity Class Bookmarks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    @Entity
    @Table(name="t_bookmarks")
    public class Bookmarks implements Serializable 
    {
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id; // Primary key
     
        @Column(name = "url", unique = true, updatable = false, nullable = false, length = 256)
        private String url;
     
        @ManyToMany(mappedBy="bmks", cascade={CascadeType.PERSIST})
        protected Collection<Tags> tags;
     
    (...)getter() and setter()(...)
    }
    Entity Class Tags :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    @Entity
    @Table(name="t_tags")
    public class Tags implements Serializable 
    {
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id; // Primary key
     
        @Column(name = "name", unique = true, updatable = false, nullable = false, length = 64)
        private String name;
     
        @ManyToMany(cascade={CascadeType.PERSIST})
        protected Collection<Bookmarks> bmks;
    (...)getter() and setter()(...)
    }
    Session bean Bookmarks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Stateless
    public class BookmarksFacadeBean implements BookmarksFacadeLocal 
    {
        @PersistenceContext
        private EntityManager em;
     
        public void create(Bookmarks bookmarks)
        {
            em.persist(bookmarks);
        }
    (...)
    }
    Bean management Bookmarks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class BookmarksManagementBean 
    {
        @EJB
        private BookmarksFacadeLocal bookmarkFacade;
     
        private long id; // Primary key
        private String url;
        protected Collection<Tags> tags;
     
        public String addBookmark()
        {
            Bookmarks b = new Bookmarks();
            Tags t = new Tags();
            ArrayList al = new ArrayList();
     
            // init new bookmark with forms
            b.setUrl(url);
     
            // init new tag with static data
            t.setName("informatique");
     
            al.add(b);
            t.setBmks(al);
     
            al = null;
            al = new ArrayList();
            al.add(t);
            tags = al;
            t.setBmks(tags);
     
            // insert data in database (t_bookmarks and t_tags)
            bookmarkFacade.create(b);
     
            return "success";
       }
    (...)
    }
    Cependant, j'ai encore un problème de PRIMARY KEY.
    Voir au prochain message.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Dans la continuité de mon précédent problème de jointure ManyToMany ...
    j'ai rencontré un problème.

    Scénarios à partir des tables vides (t_bookmarks et t_tags) :
    -Etp1) Ajouter un bookmark "toto.com" avec un tag "informatique" = aucun problème,
    -Etp2) Ajouter un bookmark "tata.com" avec un tag "informatique" = erreur dans l'insertion car il tente d'insérer à nouveau le tag "informatique" (seulement , il existe déjà dans la table).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    HTTP Status 500 - 
    javax.persistence.EntityExistsException: 
    Exception Description: Cannot persist detached object [com.xx.xx.ejb.entities.Tags[id=4]]. 
    Class> com.xx.xx.ejb.entities.Tags Primary Key> [4]
    Vous pourrez voir dans les extraits de code ci-dessus que j'ai déclaré des "Integer" comme PK_ID.

    Ainsi, je recherche une solution qui va me permettre d'avoir une vrai gestion intégré ces simples tables ManyToMany.

    Merci d'avance.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Le problème est résolu

    Il s'agissait en réalité d'effectuer une simple mise à jour "MERGE" dans la table au lieu de faire un "PERSIT".

    J'ai eu aussi quelques problèmes de jointures, mais ils ont tous été résolus en suivant ce principe :

    Pour la fonction d'ajout d'un bookmark :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Bookmarks bmk = new Bookmarks();
    Tags t = new Tags();
    ArrayList al = new ArrayList();
     
    bmk.setUrl(url);
    t.setName(name);
    al.add(bmk);
    t.setBookmarks(al);
     
    al = null;
    al = new ArrayList();
    al.add(t);
    bmk.setTags(al);
     
    bookmarkFacade.edit(bmk);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/10/2009, 12h58
  2. Probleme de mis a jour ManyToMany
    Par kore62 dans le forum JPA
    Réponses: 3
    Dernier message: 08/01/2008, 02h11
  3. probleme apres mis a jour
    Par Blo0d4x3 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 18/08/2006, 21h36
  4. Probleme servlet mis a jours
    Par yuriashford dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/04/2006, 15h03
  5. [] [Install] Problème de mise à jour des dll
    Par pepper dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 23/01/2003, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo