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

JPA Java Discussion :

ManyToMany avec des colonnes supplémentaires


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut ManyToMany avec des colonnes supplémentaires
    Bonjour,

    Je me trouve coincée sur un problème qui est probablement très simple, mais je ne trouve pas mon erreur
    Je souhaite utiliser une liaison ManyToMany avec des colonnes supplémentaires. J'ai donc suivi ce chapitre de l'excellent Wikibook consacré à JPA.

    Dans mon cas, j'ai une table "Photo" et une table "Defaut". Je souhaiterai lier les deux par une liaison du type ManyToMany, avec un champ supplémentaire qui décrirait le type de défaut de la photo.

    J'ai donc créé les entités suivantes :
    DBDefaut.java :
    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
    @Entity
    @Table(name="DEFAUT")
    public class DBDefaut implements Serializable {
            private static final long serialVersionUID = 1L;
            @Id
            @TableGenerator(name="DefautIdGen",
                    allocationSize=1, initialValue=1)
            @GeneratedValue(strategy = GenerationType.TABLE,
                    generator="DefautIdGen")
            @Column(name="ID_DEFAUT")
            private Long id;
     
            @OneToMany(mappedBy="dbDefaut", cascade=CascadeType.PERSIST)
            private List<DBAssociation> dbPhotos;
     
            @Column(name="PERIMETRE")
            private double perimetre;
     
            public void addPhoto(DBPhoto dbPhoto, String type, String etat,
                    long ordre) {
                    DBAssociation association = new DBAssociation();
                    association.setPhotoId(dbPhoto.getId());
                    association.setDefautId(this.id);
                    association.setDBDefaut(this);
                    association.setDBPhoto(dbPhoto);
                    association.setType(type);
     
                    this.dbPhotos.add(association);
     
                    dbPhoto.getDbDefauts().add(association);
            }
            [...]
    }
    DBPhoto.java :
    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
     
    @Entity
    @Table(name="PHOTO")
    public class DBPhoto implements Serializable {
            private static final long serialVersionUID = 1L;
            @Id
            @TableGenerator(name="PhotoIdGen",
                    allocationSize=1, initialValue=1)
            @GeneratedValue(strategy = GenerationType.TABLE,
                    generator="PhotoIdGen")
            @Column(name="ID")
            private Long id;
     
            @OneToMany(mappedBy="dbPhoto", cascade=CascadeType.PERSIST)
            private List<DBAssociation> dbDefauts;
     
            @Column(name="PHOTO")
            private String photo;
     
            public void addDefaut(DBDefaut dbDefaut, String type, String etat,
                    long ordre) {
                    DBAssociation association = new DBAssociation();
                    association.setDefautId(dbDefaut.getId());
                    association.setPhotoId(this.id);
                    association.setDBDefaut(dbDefaut);
                    association.setDBPhoto(this);
                    association.setType(type);
     
                    this.dbDefauts.add(association);
     
                    dbDefaut.getDbPhotos().add(association);
            }
            [...]
    }
    Mon entité d'association DBAssociation.java :
    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
    39
    40
     
    @Entity
    @Table(name = "DEFAUT_PHOTO")
    @IdClass(DBAssociationId.class)
    public class DBAssociation implements Serializable {
     
            private static final long serialVersionUID = 1L;
     
            @Id
            private Long defautId;
            @Id
            private Long photoId;
     
            @Column(name="TYPE")
            private String type;
     
            @ManyToOne
            @PrimaryKeyJoinColumn(name="ID_DEFAUT", referencedColumnName="ID_DEFAUT")
            private DBDefaut dbDefaut;
     
            @ManyToOne
            @PrimaryKeyJoinColumn(name="ID_PHOTO", referencedColumnName="ID_PHOTO")
            private DBPhoto dbPhoto;
     
            [...]
    }
     
    public class DBAssociationId implements Serializable {
            private static final long serialVersionUID = 1L;
     
            private Long defautId;
     
            private Long photoId;
     
            public DBAssociationId(Long defautId, Long photoId) {
                    this.defautId = defautId;
                    this.photoId = photoId;
            }
            [...]
    }
    Ensuite je laisse Netbeans se charger de la création des controllers.

    Je ne sais pas si le problème vient de la déclaration de mes entités, ou bien de l'utilisation que j'en fais... Quand je veux créer des objets et les insérer dans ma base, je fais une requête comme ceci :
    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
     
    DBDefaut dBDefaut = new DBDefaut();
    dBDefaut.setDbPhotos(new ArrayList<DBAssociation>());
     
    DBPhoto dBPhoto = new DBPhoto();
    dBPhoto.setDbDefauts(new ArrayList<DBAssociation>());
    dBDefaut.addPhoto(dBPhoto, "type");
     
    try {
    	DBPhotoJpaController dBPhotoJpaController = new DBPhotoJpaController();
    	dBPhotoJpaController.create(dBPhoto);
    	DBDefautJpaController dBDefautJpaController = new DBDefautJpaController();
    	dBDefautJpaController.create(dBDefaut);
    } catch (Exception e) {
    	IJ.log(e.toString());
    }
    Et enfin l'erreur que j'obtiens est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.
    Je comprends bien qu'à un moment, je dois faire quelque chose d'illégal avec les clés primaires... Mais je n'arrive pas à savoir d'où vient mon problème. Pourriez-vous m'éclairer?

    Merci beaucoup

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut
    Bonjour,

    Je me permets de relancer mon topic, je n'ai toujours pas trouvé de solution. Si mon problème est mal expliqué, je peux reformuler

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut
    Bonjour,

    Problème résolu. J'ai laissé reposer les choses avant d'y revenir

    Le problème venait du fait que mes ID sont générés automatiquement. Il fallait donc que je crée d'abord mes entités dans la base, avant d'ajouter l'association (en éditant les objets).
    Sinon, une erreur se produisait lors de la tentative de création des associations dans la table (PK null).

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

Discussions similaires

  1. ManyToMany avec des colonnes de données supplémentaires
    Par Jonathan.b dans le forum Doctrine2
    Réponses: 0
    Dernier message: 27/03/2012, 14h36
  2. DataTable avec des colonnes dynamiques
    Par PrinceDeLu dans le forum JSF
    Réponses: 5
    Dernier message: 15/04/2011, 11h54
  3. Réponses: 3
    Dernier message: 10/05/2007, 15h12
  4. Réponses: 4
    Dernier message: 05/12/2006, 12h43
  5. [CSS] Remplacer un tableau avec des colonnes
    Par mullger dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 22/08/2006, 16h30

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