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 :

Relation 1-n et n-1


Sujet :

JPA Java

  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 273
    Points : 4 105
    Points
    4 105
    Par défaut Relation 1-n et n-1
    Bonjour,

    Je suis en train de réaliser une application me permettant de générer des devis mais je me heurte à des erreur sur mes relations :
    - 1-n : une commande contient plusieurs lignes et une ligne est associée à une unique commande
    - n-1 : une ligne est associé à un produit mais un produit peut être associé à plusieurs lignes (si matériau ou couleur sont différent)
    Code java : 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="commande")
    public class Commande{
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column (name="id")
    	private int id;
    	@OneToMany(mappedBy = "commande", cascade=CascadeType.ALL)
    	private Set<Ligne> myLines=new HashSet<Ligne>(10);
    }
    @Entity
    @Table (name="produit")
    public class Produit {
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column (name="Id")
    	//@ManyToOne
        //@JoinColumn(name="id")
    	private int id;
    }
    @Entity
    @Table (name="ligne")
    public class Ligne {
    	@Id
    	@ManyToOne
        @JoinColumn(name="commande")
    	private Commande commande;
    	@Id
    	@OneToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL) 
    	@JoinColumn(name="produit", unique=true, nullable=false, updatable=false)
    	private Produit produit;
    	@Column (name="quantity")
    	private short quantity;
    	@Id
    	@Column (name="material")
    	private String material;
    	@Id
    	@Column (name="color")
    	private int color;
    }

    Je sauvegarde mes données de la manière suivante :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Commande c=new Commande();
    //ajout de chaque ligne avec les produits
    Session s=HibernateUtils.getSessionFactory().openSession();
    s.save(c);
    s.close();
    Je souhaite que l'enregistrement se face dans l'ordre suivant :
    - enregistrement des commandes et produits
    - enregistrement des lignes

    J'ai l'erreur suivante à l'exécution :
    org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Produit

  2. #2
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 200
    Points : 792
    Points
    792
    Par défaut
    Quelle est la version d'hibernate utilisée ?
    Ingénieur Recherche et Développement en informatique à Sopra

    Page perso developpez : http://armel-ndjobo.developpez.com/
    Suivez moi sur twitter : ndjobo

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 273
    Points : 4 105
    Points
    4 105
    Par défaut
    Hibernate 4

  4. #4
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 200
    Points : 792
    Points
    792
    Par défaut
    As-tu essayé de faire un save de l'entité produit avant le save de la commande ?
    Ingénieur Recherche et Développement en informatique à Sopra

    Page perso developpez : http://armel-ndjobo.developpez.com/
    Suivez moi sur twitter : ndjobo

  5. #5
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 200
    Points : 792
    Points
    792
    Par défaut
    Je souhaite que l'enregistrement se face dans l'ordre suivant :
    - enregistrement des commandes et produits
    - enregistrement des lignes
    Vue la propagation des opérations d'enregistrement (cascade.all), je ne pense pas que cet ordre sera respecté. L'ordre d'enregistrement (d'après tes configurations) est plutôt le suivant : commandes -> lignes -> produits. Ce qui va créer des violations de contraintes d'intégrité. Car, la colonne de jointure produit n'aura aucune référence dans la table Produit au moment de son enregistrement dans la table Ligne. Donc, le mieux que tu puisses faire, c'est d'enregistrer premièrement l'entité Produit avant d'enregistrer Commande.
    En passant, c'est pas du JPA que tu fais ici , c'est du Hibernate pur dont l'espace de discussion est Discussion hibernate.
    Ingénieur Recherche et Développement en informatique à Sopra

    Page perso developpez : http://armel-ndjobo.developpez.com/
    Suivez moi sur twitter : ndjobo

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 273
    Points : 4 105
    Points
    4 105
    Par défaut
    J'enregistre les commandes, j'enregistre les produits ma la ligne n'est pas enregistrée :/

  7. #7
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 200
    Points : 792
    Points
    792
    Par défaut
    tu peux poster ton code ?
    Ingénieur Recherche et Développement en informatique à Sopra

    Page perso developpez : http://armel-ndjobo.developpez.com/
    Suivez moi sur twitter : ndjobo

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 273
    Points : 4 105
    Points
    4 105
    Par défaut
    Ca marche si j'enregistre la commande, les produits puis la ligne mais j'aimerais les insertion en cascade comme précisé dans mon premier post
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Commande c=new Commande();
    //ajout des produits et des lignes
    Session s=HibernateUtils.getSessionFactory().openSession();
    s.save(c);
    for(Produit p : c.getProduits()) //mon set de produit est transcient dans l'entité Commande
      s.save(p);
    for(Ligne l : c.getLignes())
      s.save(l);
    s.close();

    Commande plus en détail :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Entity
    @Table (name="commande")
    public class Commande{
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column (name="id")
    	private int id;
    	@OneToMany(mappedBy = "commande", cascade=CascadeType.ALL)
    	private Set<Ligne> myLines=new HashSet<Ligne>(10);
    	@Transcient
    	private Set<Produit> myProducts=new HashSet<Produit>(5);
    }


    Mes relations doivent elle être bidirectionnelles pour fonctionner ?

  9. #9
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    et comment ajoutes-tu tes lignes de commande a ta commande?

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 273
    Points : 4 105
    Points
    4 105
    Par défaut
    Dans ma classe commande j'utilise le bout de code suivant :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void addLine(Ligne l) {
    	l.setCommande(this);
    	myLines.add(l);
    }

  11. #11
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    voici le procedé:

    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
     
    Commande commande = new Commande();
     
            //je cree 2 lignes pour une commande
            Ligne ligne1 = new Ligne();
            ligne1.setCommande(commande);
            ligne1.setBezahlt(false);
            ligne Ligne2 = new Ligne();
            ligne2.setCommande(commande);
            ligne2.setBezahlt(true);
            //attache les lignes a la commande
            List<Ligne> lignes = new ArrayList<Ligne>();
            lignes.add(ligne1);
            lignes.add(ligne2);
            commande.setLignes(lignes);
     
            // et je sauvegarde le tout
          Session s=HibernateUtils.getSessionFactory().openSession();
    s.save(commande);
    s.close();
    eric

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 273
    Points : 4 105
    Points
    4 105
    Par défaut
    C'est ce que je fais mais j'ai toujours une erreur.
    Je pense que mes annotations ne sont pas forcément bonnes :/

  13. #13
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    peux-tu nous montrer le code de tes entités, la je pourrais simuler par rapport a ce que tu as, et je pourrais t´en dire plus, car chez moi, cela marche sans erreur(c´est vrai que je l´ai fait de facon simpliste)

    Eric

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 273
    Points : 4 105
    Points
    4 105
    Par défaut
    J'ai changé me structure de base de données et mes tables et j'ai donc :
    Commande 1-----* Fichier 1-----* Ligne
    Quand je fais :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Commande c=new Commande();
    //ajout de chaque ligne avec les produits
    Session s=HibernateUtils.getSessionFactory().openSession();
    s.save(c);
    s.close();
    Les commandes et les fichiers sont enregistrés mais pas la ligne et je ne génère aucune exception.
    Voici mes entités réelles (je n'ai pas mis les getters/setters/equals et autres méthodes) :
    Code java : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    @Entity
    @Table (name="order3d")
    public class Order3d implements Serializable {
    	private static final long serialVersionUID = -2241346447352903470L;
    	public enum State {DEMAND, ESTIMATED, PAYED, PENDING, PRODUCED, SENT, DELIVERED};
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	@Column (name="id")
    	private int id;
    	@Column (name="person")
    	private int person;
    	@Column (name="state", columnDefinition="smallint")
    	private State state;
    	@Column (name="labor_expense")
    	private float laborExpense=0;
    	@Column (name="travel_expense")
    	private float travelExpense=0;
    	@Column (name="validity_date")
    	private Date validityDate;
    	@Column (name="demand_date")
    	private Date demandDate;
    	@Column (name="estimate_date")
    	private Date estimateDate;
    	@Column (name="order_date")
    	private Date orderDate=null;
    	@Column (name="modification", columnDefinition="TEXT")
    	private String modification;
    	@Column (name="delivery", columnDefinition = "BIT", length = 1)
    	private Boolean delivery=true;
    	@OneToMany(mappedBy="order3d", cascade=CascadeType.ALL)
    	private Set<DrawFile> myDraws=new HashSet<DrawFile>(5);
    }
     
    @Entity
    @Table (name="draw")
    public class DrawFile implements Serializable {
    	private static final long serialVersionUID = -9024754876558087847L;
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	@Column (name="id")
    	private int id;
    	@Column (name="hashname", columnDefinition="CHAR(64)")
    	private String hashname;
    	@Column (name="filename")
    	private String filename="";
    	@Column (name="accepted", columnDefinition = "BIT", length = 1)
    	private Boolean accepted=true;
    	@Column (name="format")
    	private String format;
    	@Column (name="size")
    	private int size;
    	@Column(name="width")
    	short width;
    	@Column(name="depth")
    	short depth;
    	@Column(name="height")
    	short height;
    	@OneToMany(mappedBy="draw", cascade=CascadeType.ALL)
    	private Set<Order3dLine> myLines=new HashSet<Order3dLine>(5);
    	@ManyToOne
    	@JoinColumn(name="order3d_id")
    	private Order3d order3d;
    }
     
    @Entity
    @Table (name="line3d")
    public class Order3dLine implements Serializable {
    	private static final long serialVersionUID = 3993578603382571145L;
    	@NaturalId
    	@ManyToOne
    	@JoinColumn(name="draw_id")
    	private DrawFile draw;
    	@Column (name="quantity")
    	private short quantity=0;
    	@Id
    	@Column (name="material")
    	private String material;
    	@Id
    	@Column (name="color")
    	private int color;
    	@Column(name="produced")
    	short produced=0;
    	@Column(name="duration")
    	short duration=0;
    }

    PS : je suis en MySQL5

Discussions similaires

  1. Mettre en relation les contrôles DBLookUpComboBox et DBGrid
    Par Gendarmette dans le forum Bases de données
    Réponses: 7
    Dernier message: 19/01/2004, 13h16
  2. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 17h07
  3. [EJB2.1 Entity] [CMR] Relation One to Many
    Par hamed dans le forum Java EE
    Réponses: 2
    Dernier message: 31/12/2003, 14h26
  4. Réponses: 2
    Dernier message: 26/09/2003, 15h54
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 15h16

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