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

Java EE Discussion :

Problème base de données avec EJBs Entity et EJBs Session Stateless utilisés en façades


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut Problème base de données avec EJBs Entity et EJBs Session Stateless utilisés en façades
    Bonjour,

    J'essaye de suivre un tutoriel pour me faire un peu la main avec certaines notions du développement Web en Java : http://wwwdi.supelec.fr/hardebolle/t...vaEE/index.php
    Et j'en suis à le tout dernière étape (même si le tuto n'est pas encore complet). Mais j'aimerai beaucoup utiliser les même outils et bien comprendre.
    Je suis arrivé donc à cette page du tuto : http://wwwdi.supelec.fr/hardebolle/t...JEE_43-jpa.php à l'étape 4.

    Donc pour ceux qui veulent pas relire le tuto, c'est peut-être pas nécessaire, j'utilise les outils suivants : JSF, JSF Managed Beans, JPA, EJBs Entity et EJBs Session Stateless utilisés en façades, et j'arrive à l'étape où j'aimerai ajouter des éléments dans une table pré-existante de ma base de données via un formulaire.
    Il s'agit ici d'un simple prototype de eMarket.
    J'ai une page catalog.xhtml pour afficher mes produits, une page createProduct pour ajouter des produits au catalogue, et une classe CatalogManager pour gérer ces deux actions.

    CatalogManager.java :
    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
    package instructions;
     
    import entity.Product;
    import facade.ProductFacade;
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import javax.annotation.PostConstruct;
    import javax.ejb.EJB;
    import javax.faces.bean.ApplicationScoped;
    import javax.faces.bean.ManagedBean;
     
    @ManagedBean
    @ApplicationScoped
    public class CatalogManager implements Serializable {
        private ArrayList<Product> list = null;
     
        private int id;
        private String name;
        private double price;
     
        @EJB
        private ProductFacade productfacade;
     
        /**
         * Getter&Setter for list
         * @return 
         */
        public ArrayList<Product> getList(){
            return this.list;
        }
     
        public void setList(ArrayList<Product> value){
            this.list = value;
        }
     
        /**
         * Getter&Setter for id,name,price
         * @return 
         */
        public int getProductId(){
            return this.id;
        }
     
        public void setProductId(int value){
            this.id = value;
        }
     
        public String getProductName(){
            return this.name;
        }
     
        public void setProductName(String value){
            this.name = value;
        }
     
        public double getProductPrice(){
            return this.price;
        }
     
        public void setProductPrice(double value){
            this.price = value;
        }
     
        /**
         * Getter&Setter for productfacade
         * @return 
         */
        public ProductFacade getProductFacade(){
            return this.productfacade;
        }
     
        public void setProductFacade(ProductFacade value){
            this.productfacade = value;
        }
     
        public CatalogManager(){
            this.list = new ArrayList<Product>();
        }
     
        public String createProduct(){
            Product p2 = new Product();
     
            p2.setId(this.id);
            p2.setName(this.name);
            p2.setPrice(this.price);
     
            productfacade.create(p2);
     
            return "toCatalog";
        }
     
     
        @PostConstruct
        public void findProduct(){
            int i = 0;
            List<Product> l = new ArrayList<Product>();
            l = productfacade.findAll();
            for(i = 0; i < l.size(); i++){
                this.list.add(l.get(i));
            }
        }
     
    }
    catalog.xhtml :
    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
    <ui:composition template="/template.xhtml"
                    xmlns="http://www.w3.org/1999/xhtml"
                    xmlns:ui="http://java.sun.com/jsf/facelets"
                    xmlns:h="http://java.sun.com/jsf/html"
                    xmlns:f="http://java.sun.com/jsf/core">
        <ui:define name="content-to-include">
            <f:view>
                <ul>
                    <li>
                        <h:form>
                            <h:commandLink action="toIndex">
                                <h:outputText value="Retourner à l'accueil" />
                            </h:commandLink>
                        </h:form>
                    </li>
                </ul>
     
                <!-- Display products -->
                <h:dataTable value="#{catalogManager.list}" var="item">
                    <h:column>
                        <h:outputText value="#{item.id}" />
                    </h:column>
                    <h:column>
                        <h:outputText value="#{item.name}" />
                    </h:column>
                    <h:column>
                        <h:outputText value="#{item.price}" />
                    </h:column>
                    <h:column>
                        <h:form id="AddCart">
                            <h:commandButton value="Ajouter au panier" action="#{shoppingCartManager.addToCart}">
                                <f:setPropertyActionListener value="#{item}" target="#{shoppingCartManager.prodToAdd}" />
                            </h:commandButton>
                        </h:form>
                    </h:column>
                </h:dataTable>
            </f:view>  
        </ui:define>
    </ui:composition>
    createProduct.xhtml :
    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
    <ui:composition template="/template.xhtml"
                    xmlns="http://www.w3.org/1999/xhtml"
                    xmlns:ui="http://java.sun.com/jsf/facelets"
                    xmlns:h="http://java.sun.com/jsf/html"
                    xmlns:f="http://java.sun.com/jsf/core">
        <ui:define name="content-to-include">
            <f:view>
                <ul>
                    <li>
                        <h:form>
                            <h:commandLink action="toIndex">
                                <h:outputText value="Retourner à l'accueil" />
                            </h:commandLink>
                        </h:form>
     
                        <h:form>
                            <!-- Champs formulaire référence produit -->
                            <h:outputLabel id="label_id" for="id" value="Référence du produit : " />
                            <h:inputText id="saisie_id" value="#{catalogManager.productId}" />
     
                            <br />
     
                            <!-- Champs formulaire nom produit -->
                            <h:outputLabel id="label_name" for="name" value="Nom du produit : " />
                            <h:inputText id="saisie_name" value="#{catalogManager.productName}" />
     
                            <br />
     
                            <!-- Champs formulaire prix produit -->
                            <h:outputLabel id="label_price" for="price" value="Prix du produit : " />
                            <h:inputText id="saisie_price" value="#{catalogManager.productPrice}" />
     
                            <br />
     
                                <h:commandButton value="Valider" action="#{catalogManager.createProduct()}" />
                        </h:form>
                    </li>
                </ul>
            </f:view>  
        </ui:define>
    </ui:composition>
    Mon problème est le suivant : Lorsque je remplis mon formulaire dans la page createProduct.xhtml, j'appelle la méthode createProduct() dans CatalogManager.java. Et je désire donc ajouter un produit dans ma table PRODUCT.
    A la validation du formulaire j'obtiens l'erreur : javax.ejb.EJBException: Transaction aborted

    Pour info j'ai utilisé deux méthodes : findAll() et create(), la première servant à lister les éléments de ma table, et l'autre ajouter un élément (ou créer). Ils sont contenus dans une classe abstraite générée automatiquement par NetBeans AbstractFacade. Je conclus que tout a été correctement configuré puisque j'ai pu listé des éléments pré-existants avec la méthode findAll() sans aucun problème. (voir : http://wwwdi.supelec.fr/hardebolle/t...JEE_43-jpa.php)

    Je sais pas si tout est clair. C'est pour ça que j'ai envoyé les liens du tuto. Je ne sais pas non plus si cette méthode est conseillée. J'aimerai utiliser la méthode create() et comprendre l'erreur, mais si vous avez des méthodes alternatives, je veux bien.

    Merci

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Par défaut
    est ce que vous pouvez nous copier votre classe "ProductFacade" pour voir exactement ce que vous avez mis ?
    parce que la plus part du temps c'est un problème d'annotation ou d'appel dans la couche service ( façade dans votre cas )

    sinon, si possible, vous pouvez posté aussi la log de l'erreur résultante d'un e.printstackTrace(); ( il faut bien sure utiliser des try catch )

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut
    Voici le code de la classe ProductFacade, je donne aussi AbstractFacade, comme ça vous avez tout. Ces pages ont étés générées automatiquement avec NetBeans (Peut etre pas ProductFacade, je me souviens plus bien, j'ai peut-etre suivi bêtement le tutoriel). Comme je découvre la notion de façades, je suis encore a essayer de bien comprendre. Donc si

    ProductFacade.java :
    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
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package facade;
     
    import entity.Product;
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
     
    /**
     *
     * @author Louis
     */
    @Stateless
    public class ProductFacade extends AbstractFacade<Product> {
        @PersistenceContext(unitName = "eMarketPU")
        private EntityManager em;
     
        @Override
        protected EntityManager getEntityManager() {
            return em;
        }
     
        public ProductFacade() {
            super(Product.class);
        }
     
    }
    AbstractFacade.java :
    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
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package facade;
     
    import java.util.List;
    import javax.persistence.EntityManager;
     
    /**
     *
     * @author Louis
     */
    public abstract class AbstractFacade<T> {
        private Class<T> entityClass;
     
        public AbstractFacade(Class<T> entityClass) {
            this.entityClass = entityClass;
        }
     
        protected abstract EntityManager getEntityManager();
     
        public void create(T entity) {
            getEntityManager().persist(entity);
        }
     
        public void edit(T entity) {
            getEntityManager().merge(entity);
        }
     
        public void remove(T entity) {
            getEntityManager().remove(getEntityManager().merge(entity));
        }
     
        public T find(Object id) {
            return getEntityManager().find(entityClass, id);
        }
     
        public List<T> findAll() {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            cq.select(cq.from(entityClass));
            return getEntityManager().createQuery(cq).getResultList();
        }
     
        public List<T> findRange(int[] range) {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            cq.select(cq.from(entityClass));
            javax.persistence.Query q = getEntityManager().createQuery(cq);
            q.setMaxResults(range[1] - range[0] + 1);
            q.setFirstResult(range[0]);
            return q.getResultList();
        }
     
        public int count() {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
            cq.select(getEntityManager().getCriteriaBuilder().count(rt));
            javax.persistence.Query q = getEntityManager().createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        }
     
    }

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Par défaut
    Bonjour pour l'exception ,elle ne donne pas beaucoup d'information .

    Ce que je vous propose est de mettre le code qui génère cette exception dans un bloc try catch et afficher avec e.getMessage, comme ça vous aurez des explications précises.

    La deuxième chose moi je ne préfère pas génèrer du code par netbeans , essayer de faire le travail vous même , une page web , un manage bean , un stateless et une entitybean, commencer par un petit exemple, rechercher sur youtube par exemple cette
    , et essayer de ne pas imiter mais de comprendre.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut
    Je suis plutôt d'accord avec vous ^^ mais j'ai des mauvaises habitudes à m'acharner en suivant quelque chose bêtement et une fois que ça marche, je comprends pourquoi. Mais je suis d'accord, il vaut mieux comprendre en amont, histoire de comprendre les problèmes générés. Merci je vais regarder la proposition et m'acharner un peu plus sur la compréhension de ce que je fais.

Discussions similaires

  1. Problème base de donnée avec api MySqlConnector
    Par Juaaah dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/06/2014, 19h18
  2. Problème base de données avec gadfly
    Par pouky dans le forum Général Python
    Réponses: 0
    Dernier message: 11/11/2012, 19h30
  3. Réponses: 1
    Dernier message: 14/02/2007, 10h48
  4. Problème d'interface de base de données avec Frontpage
    Par Auxtown-Son dans le forum Outils
    Réponses: 3
    Dernier message: 11/07/2006, 16h42
  5. Problème Update Base de données avec les composants ADO
    Par lingli dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/04/2006, 00h41

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