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 :

Confusion entre les entités et JPA


Sujet :

JPA Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 108
    Points : 56
    Points
    56
    Par défaut Confusion entre les entités et JPA
    Bonjour à tous,

    Ayant découvert Java depuis peu, il y a certains points qui sont encore pour moi très flou.

    Du coup je me retrouve face à un autre problème..
    Pour m'entraîner, je fais un sorte de gestionnaire de produits/catégories sous forme de Back office.
    Mon but, est d'ajouter un produit à ma base, en passant par Jpa ...
    Mon problème est que je n'arrive pas à ajouter ou même définir une table pour mes produits ...

    J'avais mis comme annotation sur mon entité Product:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Table(name="PRODUCTS")
    Afin de définir ma table products.
    Mais de ce fait, je me retrouve face à quelque chose d'étrange (du moins pour moi ^^).

    Lorsque dans mon Servlet, je fais 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
    @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
     
     
            if(request.getParameter("type") != null && request.getParameter("nom") != null){
     
    		String categoryIdParam = request.getParameter("categorie");
    		BigDecimal price = new BigDecimal(request.getParameter("price"));
     
    		Product product = new Product();
    		product.setName(request.getParameter("nom"));
    		product.setContent(request.getParameter("type"));
    		product.setPrice(price);
                    product.setId(null);
     
    		if(categoryIdParam != null && !categoryIdParam.isEmpty()) {
    			Long categoryId = Long.valueOf(categoryIdParam);
    			Category category = categoryDao.getCategoryById(categoryId);
    			product.setCategory(category);
    		}
     
    		//productDao.addProduct(product);
     
     
             }
     
     
             HttpServletResponse resp = (HttpServletResponse) response;
             resp.sendRedirect(getServletContext().getContextPath()+"/auth/listProduct");
     
        }
    Un produit s'ajoute à la Base, alors que je ne suis même pas passé par JPA ! (l'utilisation de JPA est en commentaire dans le code ci-dessus).
    Alors que si j'enlève l'annotation @Table, et que je décommente l'appel Jpa ci-dessus, il cherche mes produits dans la table "Product" (via JPA) qui n'existe pas bien évidement ...
    En fait, qu'est-ce qui peut m'assurer que je suis bien passé par Jpa ? ^^

    C'est compliqué de se plonger dans Java alors que l'on a eu que 3 jours de cours condensés ^^

    Dans tous les cas, je vous remercie d'avance pour toute l'aide que vous pourriez m'apporter

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Peux-tu montrer le code des 2 entités et le persistence.xml également...

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 108
    Points : 56
    Points
    56
    Par défaut
    Allez, soyons fous, je vous montre la totalité:

    Le servlet, se trouve ci-dessus.

    Le persistence.xml:
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    	<persistence-unit name="SupCommerce-PU" transaction-type="RESOURCE_LOCAL">
    		<provider>org.hibernate.ejb.HibernatePersistence</provider>
    		<properties>
    			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
    			<property name="javax.persistence.jdbc.user" value="root" />
    			<property name="javax.persistence.jdbc.password" value="" />
    			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/SupCommerce" />
                            <property name="eclipselink.cache.shared.default" value="false"/>
          		<property name="hibernate.hbm2ddl.auto" value="update" />
          		<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
    		</properties>
    	</persistence-unit>
    </persistence>
    L'entité Product:
    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
    package com.argetprod.supcommerce.entity;
     
    import java.io.Serializable;
    import java.math.BigDecimal;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
     
    /**
     *
     * @author Flo
     */
    @Entity
    @Table(name="PRODUCTS")
    public class Product implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
        @Column(unique=true, nullable=true)
        private String name;
        @Column(unique=false, nullable=true)
        private String content;
        @Column(unique=false, nullable=true)
        private BigDecimal price;
        @ManyToOne
        @JoinColumn(name="category_fk")
        private Category category;
     
        public Product() {
     
        }
     
        public Product(String name, String description, BigDecimal price, Category category) {
            this.name = name;
    	this.content = description;
    	this.price = price;
    	this.category = category;
        }
     
        public Category getCategory() {
            return category;
        }
     
        public void setCategory(Category category) {
            this.category = category;
        }
     
        public String getContent() {
            return content;
        }
     
        public void setContent(String content) {
            this.content = content;
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public BigDecimal getPrice() {
            return price;
        }
     
        public void setPrice(BigDecimal price) {
            this.price = price;
        }
     
     
        public Long getId() {
            return id;
        }
     
        public void setId(Long id) {
            this.id = id;
        }
     
    }
    Le PersistenceManager:
    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
    package com.argetprod.supcommerce.util;
     
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
     
     
     
    /**
     *
     * @author Flo
     */
     
    public class PersistenceManager{
     
        private static EntityManagerFactory emf;
     
        public static EntityManagerFactory getEmf() {
     
            if(emf == null){
                emf = Persistence.createEntityManagerFactory("SupCommerce-PU");
            }
            return emf;
     
        }
     
     
     
        public static void closeEntityManagerFactory() {
     
            if(emf != null && emf.isOpen()) emf.close();
     
        }
     
     
     
    }
    Le DaoFactory:
    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
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package com.argetprod.supcommerce.dao;
     
    import com.argetprod.supcommerce.dao.jpa.JpaCategoryDao;
    import com.argetprod.supcommerce.dao.jpa.JpaProductDao;
    import com.argetprod.supcommerce.util.PersistenceManager;
     
    /**
     *
     * @author Flo
     */
    public final class DaoFactory {
     
    	private static DaoFactory instance;
     
    	private CategoryDao categoryDao;
    	private ProductDao productDao;
     
    	public static DaoFactory getInstance() {
    		if(instance == null) {
    			instance = new DaoFactory();
    		}
    		return instance;
    	}
     
    	public CategoryDao getCategoryDao() {
    		if(categoryDao == null) {
    			categoryDao = new JpaCategoryDao(PersistenceManager.getEmf());
    		}
    		return categoryDao;
    	}
     
    	public ProductDao getProductDao() {
    		if(productDao == null) {
    			productDao = new JpaProductDao(PersistenceManager.getEmf());
    		}
    		return productDao;
    	}
     
    }
    Bon, après j'ai une interface nommée ProductDao dont je ne vois pas l'intérêt de vous montrer ...
    Et donc, pour finir, mon JpaProductDao (du moins une partie, parce qu'il a quand même pas mal de lignes:
    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
    package com.argetprod.supcommerce.dao.jpa;
     
    import com.argetprod.supcommerce.dao.ProductDao;
    import com.argetprod.supcommerce.entity.Product;
    import java.util.List;
    import javax.persistence.*;
     
    /**
     *
     * @author Flo
     */
    public class JpaProductDao implements ProductDao {
     
    	private EntityManagerFactory emf;
     
     
    	public JpaProductDao(EntityManagerFactory emf) {
    		this.emf = emf;
    	}
     
            public JpaProductDao() {
                throw new UnsupportedOperationException("Not yet implemented");
            }
     
     
            @Override
    	public Product addProduct(Product product) {
    		Product result = null;
    		EntityManager em = emf.createEntityManager();
    		try {
    			em.getTransaction().begin();
    			em.persist(product);
    			em.getTransaction().commit();
    			result = product;
    		} finally {
    			if(em.getTransaction().isActive()) em.getTransaction().rollback();
    			em.close();
    		}
    		return result;
    	}
     
    /* Suite du code ... */
    Voilà . Tout un paquet de fichiers ! ^^

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Avec le code que tu montres, je ne vois pas comment il peut persister l'entité "Product".
    Tu es sûr que le code montré est celui qui est exécuté ?

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 108
    Points : 56
    Points
    56
    Par défaut
    Sûr et certain !
    Au pire, je t'envoies l'archive de mon projet ? (il n'y a rien de secret dans tous les cas)

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    ok, ce sera certainement plus facile de trouver avec l'intégralité du projet

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 108
    Points : 56
    Points
    56
    Par défaut
    Le lien de téléchargement

    Alors la base s'appelle "supcommerce" (d'où le supcommerce.sql dans l'archive)
    Autrement c'est un projet NetBeans 7. (au cas où tu ne peux pas l'ouvrir)

    Et pour finir, si tu as une erreur de persistence lorsque tu atteint la page listCategory ou listProduct, je n'en connais pas la cause, mais j'ai trouvé une solution de substitution que j'explique ici.

    Merci beaucoup en tout cas pour ton aide

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je regarde le tout et je te tiens au courant... bon, peut-être pas tout de suite, mais ce week-end

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 108
    Points : 56
    Points
    56
    Par défaut
    C'est vraiment sympa de ta part, merci encore !

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut
    Dans le fichier persistence.xml


    remplacer cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.hbm2ddl.auto" value="update" />

    par cette ligne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.hbm2ddl.auto" value="create" />

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 108
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par exhortae Voir le message
    Dans le fichier persistence.xml


    remplacer cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.hbm2ddl.auto" value="update" />

    par cette ligne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.hbm2ddl.auto" value="create" />
    Mais si j'ai bien compris l'utilité de "create" et "update", si je me mets en mode create, à chaque fois que je re-builderais mon projet, ou même à chaque fermeture de session, il effacera toute ma base non ? J'utilisais create avant, et suis passé à update après pour éviter ce problème ...

  12. #12
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Arget Voir le message
    Mais si j'ai bien compris l'utilité de "create" et "update", si je me mets en mode create, à chaque fois que je re-builderais mon projet, ou même à chaque fermeture de session, il effacera toute ma base non ? J'utilisais create avant, et suis passé à update après pour éviter ce problème ...
    Tu as du persister un objet de type Produit au départ. Je doute que ton code ajoute un nouveau produit à chaque exécution surtout sans faire appel à la méthode add de ton dao. Le produit que tu vois a du être persisté au début.

    Test avec la valeur create et tu verras si c'est le cas.


    Quand tu développe tu utilises create, c'est seulement en production que tu mets update.

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 108
    Points : 56
    Points
    56
    Par défaut
    Et bien, c'était exactement ça !
    Merci beaucoup en tout cas, mon problème est résolu

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/05/2013, 14h18
  2. les propriétés de navigation entre les entités
    Par midialzer dans le forum Silverlight
    Réponses: 0
    Dernier message: 13/08/2012, 15h00
  3. Confusion entre les caratere '\n'et '\r'
    Par uriotcea dans le forum Débuter
    Réponses: 5
    Dernier message: 17/02/2012, 12h03
  4. Méthode de travail entre les entités
    Par poussinphp dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 29/04/2007, 19h21
  5. Confusions entre les one/many-to-many/one
    Par TigrouMeow dans le forum Hibernate
    Réponses: 1
    Dernier message: 01/01/2007, 21h44

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