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 :

Questions précises sur les relations


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut Questions précises sur les relations
    Bonjour à tous,

    Encore en pleine galère sur JPA et les relations ! Malgré mes recherches sur le net depuis des heures je ne trouve pas les cas dans lesquels je suis.

    Actuellement j'ai ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    More than one row with the given identifier was found: 000002, for class: com.icl.m3.model.OrderLine
    Le message d'erreur est du au faite que j'ai 2 orderLine avec un BOOKS_ID similaire (000002) MAIS ces 2 orderLine on un ID différent donc ça devrait passer.

    Voici mes tables abrégées :

    table BOOKS :
    - ISBN13(string)
    - UNIT_PRICE

    table ORDER_LINES:
    - ID (PK)
    - BOOKS_ID(string)

    Je veux pouvoir faire en sorte que :
    - 1 ligne de commande ne peut avoir qu'un livre
    - 1 livre peut être sur plusieurs ligne de commande
    - Relation imposée : OneToOne

    Je veux pouvoir également :
    - Récupérer mon livre via ma ligne de commande

    Voici ma classe de book:
    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
    @Entity
    @XmlRootElement
    @Table(name = "BOOKS")
    public class Book implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	// ////////////////Colonnes//////////////////
     
    	@Id
    	@NotNull
    	@Length(max = 17, message = "Référence trop grande")
    	@Column(name = "ISBN13")
    	private String isbn;
     
    	@Column(name = "UNIT_PRICE")
    	private Double unitPrice;
     
     
    	// ////////////////Relations//////////////////
     
    	// 06
    	@OneToOne(mappedBy = "book")
    	private OrderLine orderLine;
    Voici ma classe OrderLine :
    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
    @Entity
    @XmlRootElement
    @Table(name = "ORDER_LINES")
    public class OrderLine implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	// ////////////////Colonnes//////////////////
     
    	@Id
    	@NotNull
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "ID")
    	private Integer id;
     
    	//@NotNull
    	//@Length(max = 17)
    	//@Column(name = "BOOKS_ID")
    	//private String booksIsbn13;
     
     
    	// ////////////////Relations//////////////////
     
    	// 06
    	// Création/liaison du champs BOOKS_ID dans la table OrderLine pointant vers l'ID ISBN13 de la table BOOKS
    	@OneToOne
    	@JoinColumn(name = "BOOKS_ID", referencedColumnName = "ISBN13")
    	private Book book;
    Je voudrais aussi pouvoir déclarer ma @Column(name = "BOOKS_ID") afin de lui mettre les annotations que vous pouvez déjà voir en commentaire (Sauf si il y a une autre manière de faire).

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    La relation one to one ne peut pas fonctionner. Tu ne peux pas réutiliser les tuples de la table BOOKS avec one to one car... UN livre ne peut appartenir qu'à UNE SEUL ligne de commande. C'est donc du many to one (un même livre peut appartenir à plusieurs lignes de commande).

    De plus, je vois que tu as mis l'annotation @XmlRootElement, probablement pour exporter tes entités directement en xml ou json. C'est assez mauvais, de s'asspuyer sur des beans persistés pour en faire le modèle sérialisé directement, mieux vaut créer une classe dédiée à la sérialisation xml/json et faire un mapping entre les 2 (ça permet de découpler la base et l'exposition des services web)


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Merci de la confirmation Pill_S, j'avais pensé à cette éventualité comme quoi le OneToOne me trompé... tant pis je change le cahier des charges

    L'annotation @XmlRootElement a était généré par défaut avec mon projet de base donc je l'ai laissé dans mes entités. Je n'exporte rien en xml ou json, je vais donc les supprimer

    Serais-tu comment faire pour créer ma colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @NotNull
    @Length(max = 17)
    @Column(name = "BOOKS_ID")
    private String booksIsbn13;
    et faire la jointure OneToMany pointant vers cette colonne ?
    Car avec le OneToOne j'ai du mettre le code ci-dessus en commentaire car le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @JoinColumn(name = "BOOKS_ID", referencedColumnName = "ISBN13")
    n'accepté pas le fait que BOOKS_ID existe déjà.

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    en jpa, tu ne référence jamais les clés étrangères, mais plutôt les instances correspondant à la table pointée par une clé étrangère. Donc bookIsbn13 devrait être de type book. Si tu veux l'isbn, tu fais book.getIsbn()

    Donc une relation de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn("BOOKS_ID")
    private Book book;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Donc je devrais mettre tout ça dans ma classe orderLine ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class....
    ....
    @NotNull
    @Length(max = 17)
    @Column(name = "BOOKS_ID")
    private String booksIsbn13;
     
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn("BOOKS_ID")
    private Book book;
    ......
    Mais comment, en base, l'orderLine va comprendre que le contenu de sa colonne c'est bien le contenu de la colonne ISBN13(PK) de ma table BOOK ?

  6. #6
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    C'est tout le principe de jpa, passer du relationnel à l'objet. Il comprend comme un grand que la référence à book doit être traduite dans la table par l'id de book! Le nom book_id que tu met dans l'annotation ne sert qu'à nommer la colonne qui stocke la référence.
    Par contre, comme tu as plusieurs orderline possible pour un book, tu dois avoir me semble t il :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn("BOOKS_ID")
    private Book book;
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @OneToMany(mappedBy="book")
    @JoinColumn ("ORDERLINE_ID")
    private Set<Orderline> orderlines;
    Bon courage.

  7. #7
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par chido Voir le message
    Donc je devrais mettre tout ça dans ma classe orderLine ? :
    Non. Tu enlèves complètement la déclaration du champ "bookIsbn13". Tu ne références *pas* les clés étrangères, mais *que* les instances référencées. Ne pense plus relationnel avec entités, relations et clés. Penses en objet, avec instances et références entre ces instances.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/08/2013, 05h56
  2. [AC-2007] Question de débutant sur les relations
    Par stygmats dans le forum Modélisation
    Réponses: 2
    Dernier message: 16/11/2009, 14h46
  3. Petite question sur les relation N-N
    Par arn000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2008, 15h18
  4. Question sur les relations entre les objets
    Par kedare dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 18/04/2008, 15h13
  5. Réponses: 2
    Dernier message: 08/01/2008, 06h56

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