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 :

@OneToMany sur une Map<Product,Integer>


Sujet :

JPA Java

  1. #1
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut @OneToMany sur une Map<Product,Integer>
    Je rencontre encore un autre problème... (décidément)

    Pour pouvoir associer un produit et sa quantité, j'ai choisi d'utiliser une Map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @OneToMany(fetch=FetchType.EAGER)
    private Map<Product, Integer> products;
    Je veux que le OneToMany s'applique à Product, mais Integer je ne lui donne pas d'association (on s'en fout du Integer).

    et j'obtiens l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: ejb.User.cart.products[java.lang.Integer]
    Une idée?

  2. #2
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Salut !

    Petite question : pourquoi dans ta classe Product n'as-tu pas une propriété quantity de type int ?

    @+

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Pam62240
    Salut !

    Petite question : pourquoi dans ta classe Product n'as-tu pas une propriété quantity de type int ?

    @+
    Parce que un même product (par exemple écran iiyama tel type) ne représente que la "référence" du produit.

    Après les magasins peuvent avoir les produits en différentes quantité, par exemple fnac, 10 écran llyama, alors que topachat, 2 écran llyama...

    C'est pas une propriété du produit...

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Bon j'ai essayé de changer de structure, mais je rencontre un autre problème.

    Maintenant, un User (entity) a un attribut Cart (embedded), qui contient une Map<Integer,ProductQuantity> (ProductQuantity est embedded).

    Le problème est que quand je récupère un User, getCart() renvoie toujours null...

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    @Entity
    public class User implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue
        private int id;
     
        private String nickName;
        private String password;
        private String firstName;
        private String lastName;
        private String mail;
        private Account account;
        private boolean admin;
        @Embedded
    //    @OneToOne
        private Cart cart;
     
        public User() {
            account = new Account();
            cart = new Cart();
        }
     
        public User(String nickName, String password, String firstName, String lastName, String mail, boolean admin) {
            account = new Account();
            cart = new Cart();
            this.nickName = nickName;
            this.password = password;
            this.firstName = firstName;
            this.lastName = lastName;
            this.mail = mail;
            this.admin = admin;
        }
     
        public Account getAccount() {
            return account;
        }
     
        public String getFirstName() {
            return firstName;
        }
     
        int getId() {
            return id;
        }
     
        public String getLastName() {
            return lastName;
        }
     
        public String getMail() {
            return mail;
        }
     
        public String getNickName() {
            return nickName;
        }
     
        public String getPassword() {
            return password;
        }
     
        public boolean isAdmin() {
            return admin;
        }
     
        public List<ProductQuantity> getProducts() {
            return cart.getProducts();
        }
     
        public Cart getCart() {
            return cart;
        }
     
    //    void setCart(Cart cart) {
    //        this.cart = cart;
    //    }
     
    //    public void addProductInCart(Product product, int quantity) {
    //        cart.addProduct(product, quantity);
    //    }
     
        public void setAdmin(boolean admin) {
            this.admin = admin;
        }
     
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
     
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
     
        public void setMail(String mail) {
            this.mail = mail;
        }
     
        public void setPassword(String password) {
            this.password = password;
        }
     
        public String toString() {
            return id + "- " + nickName;
        }
     
    }
    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 Cart implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        /** Association product.id / ProductQuantity */
        @Embedded
        private Map<Integer, ProductQuantity> products;
     
        public Cart() {
            products = new HashMap<Integer, ProductQuantity>();
        }
     
        public void addProduct(Product product, int quantity) {
            ProductQuantity productQuantity = products.get(product.getId());
            if (productQuantity == null) {
                productQuantity = new ProductQuantity(product, quantity);
                products.put(product.getId(), productQuantity);
            } else {
                productQuantity.addQuantity(quantity);
            }
        }
     
        public void removeProduct(Product product, int quantity) {
            ProductQuantity productQuantity = products.get(product.getId());
            if (productQuantity != null) {
                if (productQuantity.getQuantity() > quantity) {
                    productQuantity.removeQuantity(quantity);
                } else {
                    products.remove(product.getId());
                }
            }
        }
     
        public List<ProductQuantity> getProducts() {
            List<ProductQuantity> result = new ArrayList<ProductQuantity>();
            for(Entry<Integer,ProductQuantity> entry : products.entrySet()) {
                result.add(entry.getValue());
            }
            return result;
        }
     
        public void merge(Cart cart) {
            //TODO
        }
     
        public void clear() {
            products.clear();
        }
     
    }
    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
    @Embeddable
    public class ProductQuantity implements Serializable {
     
        private static final long serialVersionUID = 1L;
        @OneToMany(fetch = FetchType.EAGER)
        private Product product;
        private int quantity;
     
        ProductQuantity(Product product, int quantity) {
            this.product = product;
            this.quantity = quantity;
        }
     
        public int getQuantity() {
            return quantity;
        }
     
        void setQuantity(int quantity) {
            this.quantity = quantity;
        }
     
        void addQuantity(int quantity) {
            this.quantity += quantity;
        }
     
        void removeQuantity(int quantity) {
            this.quantity -= quantity;
        }
     
    }
    Merci de vos éclaircissements

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Même plus généralement, quand je mets un attribut @Embedded d'une classe @Embeddable, quand je récupère sa valeur c'est toujours null, comme s'il n'était pas mappé...

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par ®om
    Parce que un même product (par exemple écran iiyama tel type) ne représente que la "référence" du produit.

    Après les magasins peuvent avoir les produits en différentes quantité, par exemple fnac, 10 écran llyama, alors que topachat, 2 écran llyama...

    C'est pas une propriété du produit...
    Dans ce cas, je pense que le problème vient plutôt de la modélisation que tu as faite de ta base de données.
    Si j'ai bien compris, tu as une relation ManyToMany entre ta table (classe) Store (si tu l'as nommée ainsi) et ta table (classe) Product : un magasin peut posséder plusieurs produits et un produit peut être présents dans plusieurs magasin. Il te faut donc une table (classe) intermédiaire, dans laquelle tu auras 2 attributs, l'id de ton store et l'id de ton product, auxquels tu pourras ajouter un attribut quantity.

    Je me trompe peut-être, mais c'est de cette manière que je vois les choses.

    En espérant que ma réponse t'aide. @+

Discussions similaires

  1. Itérer sur une map dans une jsp
    Par jplesire dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 02/07/2008, 14h41
  2. Erreur sur une map
    Par Nyko17 dans le forum C++
    Réponses: 0
    Dernier message: 24/05/2008, 22h13
  3. Réponses: 3
    Dernier message: 06/11/2007, 11h18
  4. Criteria sur une Map
    Par sup dans le forum Hibernate
    Réponses: 1
    Dernier message: 20/09/2007, 12h08
  5. OneToMany sur une hiérarchie de classe
    Par jc63 dans le forum Hibernate
    Réponses: 2
    Dernier message: 03/09/2007, 12h12

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