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 :

Quelle annotation pour une classe ayant 2 ID pointant sur 2 tables différentes


Sujet :

JPA Java

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut Quelle annotation pour une classe ayant 2 ID pointant sur 2 tables différentes
    Bonjour à tous,

    Je cherche à savoir comment je dois annoter ma classe OrderLine qui possède 2 clé primaire pointant chacune sur une table différente.

    Voici mes "obligations" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- CREATE TABLES
    CREATE TABLE ORDER_LINES (QUANTITY INTEGER NOT NULL, ORDERS_ID INTEGER NOT NULL, BOOKS_ID VARCHAR(17) NOT NULL, PRIMARY KEY (ORDERS_ID, BOOKS_ID));
    
    CREATE TABLE BOOKS (ISBN13 VARCHAR(17) NOT NULL, TITLE VARCHAR(50) NOT NULL, EDITOR VARCHAR(20), UNIT_PRICE FLOAT, AUTHOR_ID INTEGER, PRIMARY KEY (ISBN13));
    
    CREATE TABLE ORDERS (ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, ORDER_DATE TIMESTAMP, USER_ID VARCHAR(30), SHIPPING_ADR_ID INTEGER, PRIMARY KEY (ID));
    Voici mes 2 autres contraintes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- ADD FK CONSTRAINTS
    ALTER TABLE ORDER_LINES ADD CONSTRAINT ORDERLINESORDERSID FOREIGN KEY (ORDERS_ID) REFERENCES ORDERS (ID);
    
    ALTER TABLE ORDER_LINES ADD CONSTRAINT ORDERLINESBOOKS_ID FOREIGN KEY (BOOKS_ID) REFERENCES BOOKS (ISBN13);
    A la base je pensais annoter ma classe OrderLine avec @idClasse car la clé primaire est composé de 2 colonnes mais je ne vois pas comment faire pour que mes FK contraints soient respectés.

    Pourriez-vous m'aider svp ?

  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
    C'est quelle version de JPA que tu utilises pour ton projet?
    Ingénieur Recherche et Développement en informatique à Sopra

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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    JPA 2.0 je crois

  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
    ok, si c'est JPA 2.0 tu peux utiliser l'annotation @PrimaryKeyJoinColumn 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
    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
    @Entity
    @Table(name="Order_lines")
    public class OrderLines {
        @EmbeddedId
        private OrderLinesId id;
     
        @ManyToOne
        @PrimaryKeyJoinColumn(name="ORDERS_ID", referencedColumnName = "ordersId")
        private Orders orders;
     
        @ManyToOne
        @PrimaryKeyJoinColumn(name="BOOKS_ID", referencedColumnName = "booksId")
        private Books books;
     
        private int quantity;
     
        public OrderLinesId getId() {
            return id;
        }
     
        public void setId(OrderLinesId id) {
            this.id = id;
        }
     
        public Orders getOrders() {
            return orders;
        }
     
        public void setOrders(Orders orders) {
            this.orders = orders;
        }
     
        public Books getBooks() {
            return books;
        }
     
        public void setBooks(Books books) {
            this.books = books;
        }
     
     
     
        public int getQuantity() {
            return quantity;
        }
     
        public void setQuantity(int quantity) {
            this.quantity = quantity;
        }
    }
    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
    @Embeddable
    public class OrderLinesId {
        @Column(name="ORDERS_ID")
        private int ordersId;
        @Column(name="BOOKS_ID")
        private String booksId;
     
        public int getOrdersId() {
            return ordersId;
        }
     
        public void setOrdersId(int ordersId) {
            this.ordersId = ordersId;
        }
     
        public String getBooksId() {
            return booksId;
        }
     
        public void setBooksId(String booksId) {
            this.booksId = booksId;
        }
     
     
    }
    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
    à défaut, tu peux directement utiliser l'annotation @Id (vrai depuis JPA 2.0) comme suit :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    @Entity
    @Table(name="Order_lines")
    public class OrderLines {
    //    @EmbeddedId
    //    private OrderLinesId id;
     
        @ManyToOne
    //    @PrimaryKeyJoinColumn(name="ORDERS_ID", referencedColumnName = "ordersId")
        @Id
        @JoinColumn(name="ORDERS_ID")
        private Orders orders;
     
        @ManyToOne
    //    @PrimaryKeyJoinColumn(name="BOOKS_ID", referencedColumnName = "booksId")
        @Id
        @JoinColumn(name="BOOKS_ID")
        private Books books;
     
        private int quantity;
     
    //    public OrderLinesId getId() {
    //        return id;
    //    }
    //
    //    public void setId(OrderLinesId id) {
    //        this.id = id;
    //    }
     
        public Orders getOrders() {
            return orders;
        }
     
        public void setOrders(Orders orders) {
            this.orders = orders;
        }
     
        public Books getBooks() {
            return books;
        }
     
        public void setBooks(Books books) {
            this.books = books;
        }
     
     
     
        public int getQuantity() {
            return quantity;
        }
     
        public void setQuantity(int quantity) {
            this.quantity = quantity;
        }
    }
    Ingénieur Recherche et Développement en informatique à Sopra

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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Dans la 1er solution (avec EmbeddedId) c'est une table qui sera créée en base ? Car j'ai un fichier d'initialisation des autres tables pour ma base, est-ce que ça ne poserai pas un problème de ne pas avoir d'alimentation de cette table dans mon fichier d'initialisation ?

    Pour la 2eme solution, je vois qu'il n'y a pas d'autre entité donc ça m'a l'air mieux par rapport à notre contrainte d'initialisation (je pense ^^).

  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
    Dans la 1er solution (avec EmbeddedId) c'est une table qui sera créée en base ?
    Non. Cette classe te permet juste de gérer simplement les clés de la table. Cela ne correspond à aucune table en base de données.
    Ingénieur Recherche et Développement en informatique à Sopra

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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Un grand merci à toi je vais essayer tout ça ;-)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Petit compte rendu :

    Pour la 1er méthode, Eclipse me fait une erreur sur l'annotation @EmbeddedId de la classe OrderLines
    => Embedded ID class should include method definitions for equals() and hashcode()

    Pour la 2ème méthode, Eclipse me fait une erreur sur l'annotation@Entity de la classe OrderLines
    => This class has a composite primary key. It must use an ID class.

    Mais je sens que la solution se rapproche à grand pas !

  10. #10
    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
    Utilise donc la première méthode et défini les méthodes equals() and hashcode()
    Ingénieur Recherche et Développement en informatique à Sopra

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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    J'avoue n'avoir jamais utiliser ces fonctions (je ne suis que débutant )

    J'ai cherché sur le net et je pense avoir réussi à comprendre la méthode equals() mais pour la méthode hashcode je ne comprendre pas à quoi elle sert. Sur le net je vois qu'on y mets souvent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return "les variables string".hashcode();
    par contre moi j'ai des objets à la place ... (et ma quantity).

    Voici le code de ma classe pour vérification du equals et si tu (ou quelqu'un d'autre) peut m'expliquer l'utilisation de la méthode hashcode dans ce cas je serais content ;-).

    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
    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
     
    @Entity
    @Table(name="Order_lines")
    public class OrderLine {
     
        @EmbeddedId
        private OrderLineId id;
     
        @ManyToOne
        @PrimaryKeyJoinColumn(name="ORDERS_ID", referencedColumnName = "ordersId")
        private Order orders;
     
        @ManyToOne
        @PrimaryKeyJoinColumn(name="BOOKS_ID", referencedColumnName = "booksId")
        private Book books;
     
        private int quantity;
     
        public OrderLineId getId() {
            return id;
        }
     
        public void setId(OrderLineId id) {
            this.id = id;
        }
     
        public Order getOrders() {
            return orders;
        }
     
        public void setOrders(Order orders) {
            this.orders = orders;
        }
     
        public Book getBooks() {
            return books;
        }
     
        public void setBooks(Book books) {
            this.books = books;
        }
     
        public int getQuantity() {
            return quantity;
        }
     
        public void setQuantity(int quantity) {
            this.quantity = quantity;
        }
     
        public boolean equals(Object obj) {
        	boolean resultat = false;
        	if (obj == this) {
        		resultat = true;
        	} else {
        		if (!(obj instanceof OrderLine)) {
        			resultat = false;
        		} else {   
        			OrderLine autre = (OrderLine) obj;    	
        			if (!orders.equals(autre.orders)) {    
        				resultat = false;    	
        			} else {    
        				if (books != autre.books) {    		
        					resultat = false;
        				} else {   	
        					resultat = true;
        				}
        			}
        		}
        	}
        return resultat;
        }
     
        public int hashCode() {
        	return ??.hashCode();
        }
    }

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Petite question supplémentaire :

    Je veux faire un lien OneToOne avec la table books et un lien OneToMany de la table Orders à la table OrderLines. Je vais donc devoir gérer les liens via la classe @Embeddable : OrderLineId et ses "colonnes" :

    @Column(name="ORDERS_ID")
    private int ordersId;

    @Column(name="BOOKS_ID")
    private String booksId;

    ?

  13. #13
    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
    la méthode hashcode() retourne une valeur qui permet de stocker et retrouver les objets dans les tables de hachage telles que HashMap ou HashTable. Voici un exemple de méthode pour ton objet embeddedId
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    @Embeddable
    public class OrderLinesId {
        @Column(name="ORDERS_ID")
        private int ordersId;
        @Column(name="BOOKS_ID")
        private String booksId;
     
        public int getOrdersId() {
            return ordersId;
        }
     
        public void setOrdersId(int ordersId) {
            this.ordersId = ordersId;
        }
     
        public String getBooksId() {
            return booksId;
        }
     
        public void setBooksId(String booksId) {
            this.booksId = booksId;
        }
     
        @Override
        public int hashCode() {
            int hash = 3;
            hash = 71 * hash + this.ordersId;
            hash = 71 * hash + Objects.hashCode(this.booksId);
            return hash;
        }
     
        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final OrderLinesId other = (OrderLinesId) obj;
            if (this.ordersId != other.ordersId) {
                return false;
            }
            if (!Objects.equals(this.booksId, other.booksId)) {
                return false;
            }
            return true;
        }
     
     
    }
    tu peux générer de telles méthodes directement avec eclipse en faisant : clic droit dans la classe -> source -> generate hashCode() and equals()
    Ingénieur Recherche et Développement en informatique à Sopra

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

  14. #14
    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 veux faire un lien OneToOne avec la table books
    Si tu veux un OneToOne à sens unique de orderline vers book il suffit de remplacer l'annotation @ManyToOne par @OneToOne

    Je veux faire un lien OneToMany de la table Orders à la table OrderLines.
    créer une liste d'objet OrderLines dans la table Orders et ajoute l'annotation @OneToMany. et pour eviter que JPA considère cette deuxième annotation comme une nouvelle relation, tu vas renseigner l'attribut mappedby de l'annotation @OneToMany par le nom de l'attribut qui joue le rôle de la colonne de jointure dans la table orderLines. exple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @OneToMany(mappedBy = "orders")
    Ingénieur Recherche et Développement en informatique à Sopra

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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Merci de les info et les l'explication, je comprend certaines choses de mieux en mieux grâce à toi ! Pour les relations c'est bon.

    Par contre toujours l'erreur sur @EmbeddedId après génération auto => Embedded ID class should include method definitions for equals() and hashcode().
    J'ai remarqué que j'ai un 2eme message d'erreur => Embedded ID class should implement java.io.Serializable

    Pour ça j'ai essayé de rajouter import java.io.Serializable; mais il est souligné jaune (pas utilisé) et le message d'erreur reste.

    Voici la classe je ne vois pas le problème :
    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
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    package com.icl.m2.model;
     
    import javax.persistence.*;
    import java.io.Serializable;
     
    @Entity
    @Table(name="Order_lines")
    public class OrderLine {
     
        @EmbeddedId
        private OrderLineId id;
     
        @ManyToOne
        @PrimaryKeyJoinColumn(name="ORDERS_ID", referencedColumnName = "ordersId")
        private Order orders;
     
        @ManyToOne
        @PrimaryKeyJoinColumn(name="BOOKS_ID", referencedColumnName = "booksId")
        private Book books;
     
        private int quantity;
     
        public OrderLineId getId() {
            return id;
        }
     
        public void setId(OrderLineId id) {
            this.id = id;
        }
     
        public Order getOrders() {
            return orders;
        }
     
        public void setOrders(Order orders) {
            this.orders = orders;
        }
     
        public Book getBooks() {
            return books;
        }
     
        public void setBooks(Book books) {
            this.books = books;
        }
     
        public int getQuantity() {
            return quantity;
        }
     
        public void setQuantity(int quantity) {
            this.quantity = quantity;
        }
     
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((books == null) ? 0 : books.hashCode());
    		result = prime * result + ((id == null) ? 0 : id.hashCode());
    		result = prime * result + ((orders == null) ? 0 : orders.hashCode());
    		result = prime * result + quantity;
    		return result;
    	}
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		OrderLine other = (OrderLine) obj;
    		if (books == null) {
    			if (other.books != null)
    				return false;
    		} else if (!books.equals(other.books))
    			return false;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		if (orders == null) {
    			if (other.orders != null)
    				return false;
    		} else if (!orders.equals(other.orders))
    			return false;
    		if (quantity != other.quantity)
    			return false;
    		return true;
    	}
     
    }

  16. #16
    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 dois générer les méthodes equals et hashcode dans la classe OrderLineId et non dans OrderLine. Pour l'implémentation de la classe serializable,c'est pas une obligation. cependant, si tu veux le faire, tu devras le mettre dans toutes les entités et dans la classe OrderLineId.
    Ingénieur Recherche et Développement en informatique à Sopra

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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Pour l'erreur hashcode c'est OK ;-)

    Par contre j'ai toujours l'erreur java.io.Serializable. J'ai tenter de le mettre dans toutes mes entités et OrderLineId mais ça ne change rien.

  18. #18
    Membre éprouvé
    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 : 37
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    J'ai vu que tu as simplement importé java.io.Serializable . Tu dois aussi déclarer que ta classe implémente l'interface serializable, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public class MaClasse implements Serializable {
    }
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Cafeinoman => Merci c'était ça !

    naf87 => Un grand merci à toi pour m'avoir aidé sur mes problèmes et mes interrogations.

    Je vais continuer mon projet go go go !
    Bonne aprèm à vous 2 et peut être à très bientôt !

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Je reviens vers vous car j'ai l'erreur suivante depuis que j'ai remis les classes OrderLine et OrderLineId ainsi que les relations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JBAS014777:   Services which failed to start:      service jboss.persistenceunit."jee.basics3-ear.ear/jee.basics3-ejb.jar#BookstorePU": org.jboss.msc.service.StartException in service jboss.persistenceunit."jee.basics3-ear.ear/jee.basics3-ejb.jar#BookstorePU": Failed to start service
    Je pense que j'ai fais de mauvais liens entre OrderLine et Book/Order car à aucun moment je ne dis que BOOKS_ID pointe vers ID de ORDER et que ORDERS_ID pointe vers ISBN13 de BOOK. On est parti du principe que JPA créera les champs mais nos champs existes déjà car j'ai du créer la table avant donc il faudrait dire à la clé primaire ORDERS_ID de OrderLine de se lier à la clé primaire ID de ORDER et dire à la clé primaire BOOKS_ID de se lier à la clé primaire ISBN13 de BOOK.

    Voici mes classes actuelles :

    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
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    @Entity
    @XmlRootElement
    @Table(name = "ORDER_LINES")
    public class OrderLine {
     
    	@EmbeddedId
    	private OrderLineId id;
     
    	// 05
    	@ManyToOne
    	@PrimaryKeyJoinColumn(name = "ORDERS_ID", referencedColumnName = "ordersId")
    	private Order order;
     
    	// 06
    	@OneToOne
    	@PrimaryKeyJoinColumn(name = "BOOKS_ID", referencedColumnName = "booksIsbn13")
    	private Book book;
     
    	@Column(name = "QUANTITY")
    	private int quantity;
     
    	private double total;
     
    	public OrderLine() {
    	}
     
    	public OrderLine(Book book, int quantity) {
    		this.book = book;
    		this.quantity = quantity;
    	}
     
    	public Order getOrder() {
    		return order;
    	}
     
    	public void setOrder(Order order) {
    		this.order = order;
    	}
     
    	public Book getBook() {
    		return book;
    	}
     
    	public void setBook(Book book) {
    		this.book = book;
    	}
     
    	public double getTotal() {
    		return total;
    	}
     
    	public void setTotal(double total) {
    		this.total = total;
    	}
     
    	public OrderLineId getId() {
    		return id;
    	}
     
    	public void setId(OrderLineId id) {
    		this.id = id;
    	}
     
    	public Order getOrders() {
    		return order;
    	}
     
    	public void setOrders(Order orders) {
    		this.order = orders;
    	}
     
    	public Book getBooks() {
    		return book;
    	}
     
    	public void setBooks(Book books) {
    		this.book = books;
    	}
     
    	public int getQuantity() {
    		return quantity;
    	}
     
    	public void setQuantity(int quantity) {
    		this.quantity = quantity;
    	}
     
    	public void addOne() {
    		quantity++;
    	}
     
    	public void removeOne() {
    		quantity--;
    	}
     
    	public void computeTotal() {
    		total = book.getUnitPrice() * quantity;
    	}
    }

    OrderLineId :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    @Embeddable
    public class OrderLineId implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
        @Column(name="ORDERS_ID")
        private int ordersId;
     
        @Column(name="BOOKS_ID")
        private String booksIsbn13;
     
        public int getOrdersId() {
            return ordersId;
        }
     
        public void setOrdersId(int ordersId) {
            this.ordersId = ordersId;
        }
     
        public String getBooksId() {
            return booksIsbn13;
        }
     
        public void setBooksId(String booksId) {
            this.booksIsbn13 = booksId;
        }
     
        @Override
       	public int hashCode() {
       		final int prime = 31;
       		int result = 1;
       		result = prime * result + ((booksIsbn13 == null) ? 0 : booksIsbn13.hashCode());
       		result = prime * result + ordersId;
       		return result;
       	}
     
       	@Override
       	public boolean equals(Object obj) {
       		if (this == obj)
       			return true;
       		if (obj == null)
       			return false;
       		if (getClass() != obj.getClass())
       			return false;
       		OrderLineId other = (OrderLineId) obj;
       		if (booksIsbn13 == null) {
       			if (other.booksIsbn13 != null)
       				return false;
       		} else if (!booksIsbn13.equals(other.booksIsbn13))
       			return false;
       		if (ordersId != other.ordersId)
       			return false;
       		return true;
       	}
    }
    Order :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    @Entity
    @XmlRootElement
    @Table(name = "ORDERS")
    public class Order implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "ID")
    	private Integer id;
     
    	@Column(name = "USER_ID")
    	private String userId;
     
    	// 02
    	@ManyToOne
    	@JoinColumn(name = "SHIPPING_ADR_ID", referencedColumnName = "ID")
    	private Address shipaddress;
     
    	// 05
    	 @OneToMany(mappedBy="order") 
    	 private List<OrderLine> orderlines;
     
     
    	public List<OrderLine> getOrderlines() {
    		return orderlines;
    	}
     
    	public void setOrderlines(List<OrderLine> orderlines) {
    		this.orderlines = orderlines;
    	}
     
    	public Integer getId() {
    		return id;
    	}
     
    	public void setId(Integer id) {
    		this.id = id;
    	}
     
    	public String getUserId() {
    		return userId;
    	}
     
    	public void setUserId(String userId) {
    		this.userId = userId;
    	}
     
    	public Address getShipaddress() {
    		return shipaddress;
    	}
     
    	public void setShipaddress(Address shipaddress) {
    		this.shipaddress = shipaddress;
    	}
     
    	public static long getSerialversionuid() {
    		return serialVersionUID;
    	}
    }
    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
    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
    86
    87
    88
    89
    90
    91
    92
     
    @Entity
    @XmlRootElement
    @Table(name = "BOOKS")
    public class Book implements Serializable {
     
    	/** Default value included to remove warning. Remove or modify at will. **/
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@NotNull
    	@Column(name = "ISBN13")
    	private String isbn;
     
    	@NotNull
    	@Column(name = "TITLE")
    	private String title;
     
    	@Column(name = "UNIT_PRICE")
    	private Double unitPrice;
     
    	@Column(name = "EDITOR")
    	private String editor;
     
    	// Ok 03
    	@Column(name = "AUTHOR_ID")
    	private Integer authorId;
    	@ManyToOne
    	private Author author;
     
    	//06
    	@OneToOne(mappedBy="book") 
    	private OrderLine orderLine;
     
     
    	public OrderLine getOrderLine() {
    		return orderLine;
    	}
     
    	public void setOrderLine(OrderLine orderLine) {
    		this.orderLine = orderLine;
    	}
     
    	public String getIsbn() {
    		return isbn;
    	}
     
    	public void setIsbn(String isbn) {
    		this.isbn = isbn;
    	}
     
    	public String getTitle() {
    		return title;
    	}
     
    	public void setTitle(String title) {
    		this.title = title;
    	}
     
    	public Double getUnitPrice() {
    		return unitPrice;
    	}
     
    	public void setUnitPrice(Double unitPrice) {
    		this.unitPrice = unitPrice;
    	}
     
    	public String getEditor() {
    		return editor;
    	}
     
    	public void setEditor(String editor) {
    		this.editor = editor;
    	}
     
    	public Author getAuthor() {
    		return author;
    	}
     
    	public void setAuthor(Author author) {
    		this.author = author;
    	}
     
    	public Integer getAuthorId() {
    		return authorId;
    	}
     
    	public void setAuthorId(Integer authorId) {
    		this.authorId = authorId;
    	}
     
    }
    Et voici comment doivent être mes tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE BOOKS (ISBN13 VARCHAR(17) NOT NULL, TITLE VARCHAR(50) NOT NULL, EDITOR VARCHAR(20), UNIT_PRICE FLOAT, AUTHOR_ID INTEGER, PRIMARY KEY (ISBN13));
    CREATE TABLE ORDERS (ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, USER_ID VARCHAR(30), SHIPPING_ADR_ID INTEGER, PRIMARY KEY (ID));
    CREATE TABLE ORDER_LINES (QUANTITY INTEGER NOT NULL, ORDERS_ID INTEGER NOT NULL, BOOKS_ID VARCHAR(17) NOT NULL, PRIMARY KEY (ORDERS_ID, BOOKS_ID));
    ET également les clé secondaires (Que je n'ai pas appliqué mais ça fonctionne bien pour l'adresse et les users sans les avoirs déclaré en base):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE ORDER_LINES ADD CONSTRAINT ORDERLINESORDERSID FOREIGN KEY (ORDERS_ID) REFERENCES ORDERS (ID);
    ALTER TABLE ORDER_LINES ADD CONSTRAINT ORDERLINESBOOKS_ID FOREIGN KEY (BOOKS_ID) REFERENCES BOOKS (ISBN13);

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/11/2005, 20h21
  2. Quelle BDD pour une grande utilisation et en cluster?
    Par SkyDev dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 21/10/2005, 20h20
  3. Quelle driver pour une HIS 9800 pro ice Q
    Par Death83 dans le forum Composants
    Réponses: 9
    Dernier message: 29/09/2005, 14h14
  4. Quelle Bibliothèque pour une IA d'un RTS ?
    Par methos69 dans le forum Bibliothèques
    Réponses: 9
    Dernier message: 11/02/2005, 10h28
  5. ecrire un iterateur pour une classe
    Par Blowih dans le forum C++
    Réponses: 2
    Dernier message: 15/11/2004, 19h19

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