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 :

Problème avec le déploiement de l'application web


Sujet :

JPA Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut Problème avec le déploiement de l'application web
    Bonjour,

    J'ai un étrange problème avec JPA. Il m'arrive quelque fois d'avoir ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    No [EntityType] was found for the key class [com.XXX.entity.Experience] in the Metamodel - please verify that the [Entity] class was referenced in persistence.xml using a specific <class>com.XXX.entity.Experience</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element.
    Mon entité est bien indiqué dans persistence.xml. Je suis obligé de redémarrer le serveur pour que ça se mette à fonctionner. J'ai trouvé quelqu'un qui a le même problème sur: http://stackoverflow.com/questions/8...-the-metamodel

    Il semble dire qu'il faudrait fermer l'ancien entityManagerFactory ainsi que l'entityManager, voici ce que j'ai fait à la suite de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected EntityManager getEntityManager() {
            if (entityManager == null || !entityManager.isOpen()) {
                EntityManagerFactory emf = Persistence.createEntityManagerFactory("XXX-ejbPU");
                entityManager = emf.createEntityManager();
            }
            return entityManager;
        }
    Mais ça ne donne rien

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    L'EntityManagerFactory ne doit pas être fermée, par contre l'EntityManager oui.
    Normalement c'est ton conteneur qui se charge de fermer le contexte de persistance (EntityManager), y-a-t-il une raison particulière pour que ton contexte de persistance ne soit pas injecté ?

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Après création, je le ferme directement? Je doute pouvoir éxecuter des requetes après ça, si?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    Pas après la création, normalement tu dois fermer ton contexte de persistance (EntityManager) une fois que tu as effectué tes opérations base de données.
    Je ne l'avais pas remarqué avant mais tu recrées l'EntityManagerFactory systématiquement, pour quelle raison ?
    L'EntityManagerFactory est tread safe, généralement soit on l'injecte, soit on va la rechercher dans le JNDI, tu ne devrais avoir qu'une seule et unique référence vers cet objet.
    Quel est ton context applicatif ? JPA, Spring ? application standalone ?

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Alors une petite précision, je n'utilise pas les EJB! Je ne recréer l'entityManager qui si nécessaire, puis fermer l'entityManager à chaque requete, c'est pas un peu lourd? Je demande je n'en ai pas trop idées en fait... J'utilise avec JPA

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    J'avoue que j'ai un peu de mal à comprendre, tu me dis que tu n'utilises pas les EJB mais pourtant tu utilises JPA
    Puis-je te demander comment tu utilises la couche JPA ?
    Juste pour faire du SQL natif ?
    Dans un conteneur J2EE standard, c'est le conteneur qui ferme automatiquement l'EntityManager à la sortie de ta méthode transationnelle, il est plutôt recommandé de fermer l'EntityManager quand tu n'en a plus besoin sauf au cas où tu aies besoin de gérer des sessions étendues/longues.

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Oui j'utilise JPA sans EJB: deux choses distinctes, qu'est qu'il y a d'étrange?
    Je vais faire tenter de fermer mon entityManager à chaque transaction, ça résoudra probablement le problème.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    C'est par simple curiosité que je te poses la question.
    Si tu n'utilises pas les EJB, quel est le valeur ajoutée de JPA dans ton architecture ?

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Tout simplement que c'est un ORM

  10. #10
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Citation Envoyé par NoClassDefFound Voir le message
    C'est par simple curiosité que je te poses la question.
    Si tu n'utilises pas les EJB, quel est le valeur ajoutée de JPA dans ton architecture ?
    Bonjour, je pense que tu n'as pas tout à fait saisi le concept d'EJB, il faut bien comprendre que les EJB sont un concept qui embarque l'implémentation JPA, notamment dans l'utilisation des EJB entity.Mais tu peux très bien dans un projet utiliser JPA (pour l'ORM comme l'a fait @Babas007) sans faire aucune référence aux EJB. les EJB sont un concept beaucoup généralisé gérant la sécurité, la persistance (via JPA), la distribution (via RMI) etc...
    C'était juste pour apporter des précisions.
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  11. #11
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Dans le cas d'une utilisation RESOURCE_LOCAL de JPA sur un serveur web,
    la meilleur pratique est de ne créer qu'une unique instance d'EntityManagerFactory et d'utiliser un EntityManager par requête HTTP.
    Ce qui coûte cher c'est la création de l'EMF.

    On ne voit pas trop comment tu gère tes EM mais attention au fait qu'un EM n'est pas thread safe.

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Heimdal Voir le message
    utiliser un EntityManager par requête HTTP
    Alors à l'heure actuelle, à chaque requete je créer un nouvel entityManager, l'entitytManagerFactory. Que veux-tu dire par requete http?

  13. #13
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Etant donne que tu déploie une application et que tu n'utilises pas d'EJB, j'ai supposé que tu étais sur un projet type web. (RIA ou Webservices).
    Peut-être me suis-je trop avancé.

    Cela étant si c'est bien le cas, par requête HTTP j'entends une soumission de formulaire, un lien vers une page de ton site, un appel AJAX, un appel de webservices rest ou soap.
    Bref un point d’entrée standard dans une application web.

    La durée de vie de ton EM devrait se limiter à ca.

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    Bonjour, je pense que tu n'as pas tout à fait saisi le concept d'EJB, il faut bien comprendre que les EJB sont un concept qui embarque l'implémentation JPA, notamment dans l'utilisation des EJB entity.Mais tu peux très bien dans un projet utiliser JPA (pour l'ORM comme l'a fait @Babas007) sans faire aucune référence aux EJB. les EJB sont un concept beaucoup généralisé gérant la sécurité, la persistance (via JPA), la distribution (via RMI) etc...
    C'était juste pour apporter des précisions.
    Cela fait quelques années déjà que je programme sur du J2EE ou des ORMS, je ne pense donc pas être complètement à la ramasse sur le sujet.
    Du JPA sans EJB ?
    Pour moi "sans EJB" signifie sans @Stateless, sans @Remote, et sans @Entity, à moins que tu ne considères que les @Entity ne sont pas des EJB ?
    Si c'est le cas, je comprends mieux ta remarque, mais je trouve que c'est un abus de langage d'où mon incompréhension.
    Je reviens donc à la charge, sans @Entity, qu'est ce qu'il resterait comme logique dans ton EntityManagerFactory ?
    La datasource ? le dialecte bdd ?
    Le seul intérêt de JPA, dans le cas présent, serait de s'abstraire des différentes implémentations de base de données donc à moins que ce ne soit le cas , je ne vois pas bien quel est le plus de JPA par rapport à une gestion "manuelle" des connexions bdd et des resultSets.

  15. #15
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Citation Envoyé par NoClassDefFound Voir le message
    Cela fait quelques années déjà que je programme sur du J2EE ou des ORMS, je ne pense donc pas être complètement à la ramasse sur le sujet.
    Je ne conteste pas ton expérience, mais on est tous ici pour apprendre, moi y compris, mais le J2EE c'est assez vaste tu sais.
    Citation Envoyé par NoClassDefFound Voir le message
    Du JPA sans EJB ?
    Eh oui, sans aucun doute, relis tes notes, JPA est un concept qui a été embarqué dans les EJB pour gérer la couche d'abstraction au modèle de données,on peut faire du JPA sans jamais parlé d'EJB, de manière analogue on fait très bien du rmi sans parler d'EJB, pourtant EJB s'appuie sur du RMI pour rendre les applications distributives. Et pour ton info, tu peux aussi très bien n'utiliser un EJB qu'en service, sans avoir d'entité JPA dans ton projet.
    Citation Envoyé par NoClassDefFound Voir le message
    Pour moi "sans EJB" signifie sans @Stateless, sans @Remote, et sans @Entity, à moins que tu ne considères que les @Entity ne sont pas des EJB ?
    Les entités JPA sont des entités JPA tout d'abord, mais peuvent très bien dans un contexte EJB être des EJB entity. Mais faut vraiment que tu les vois indépendamment d'un contexte EJB, il faut les décorréler.
    Citation Envoyé par NoClassDefFound Voir le message
    Je reviens donc à la charge, sans @Entity, qu'est ce qu'il resterait comme logique dans ton EntityManagerFactory ?
    La datasource ? le dialecte bdd ?
    Le seul intérêt de JPA, dans le cas présent, serait de s'abstraire des différentes implémentations de base de données donc à moins que ce ne soit le cas , je ne vois pas bien quel est le plus de JPA par rapport à une gestion "manuelle" des connexions bdd et des resultSets.
    Tu mélanges vraiment. Quand tu auras reussi à décorreler EJB et JPA toutes tes questions trouveront leur réponse. Et une dernière chose un EJB est un composant qui a besoin d'être hébergé dans un conteneur EJB (Jboss,Jonas 5.1,etc...) alors qu'un simple tomcat suffit à heberger un projet avec JPA.
    J'espère qu'on arrivera à se comprendre.Voila un article que j'aime bien
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  16. #16
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    Rassures-toi, je le prends bien et on apprend à tout âge, j'en suis la preuve, celui qui n'apprend plus s'ennuie et régresse petit à petit mais comme tu as pu le remarquer je peux parfois être ( un peu ?) buté.
    Je suis d'accord avec la plupart de tes remarques sauf que tu ne me feras jamais parler "d'entité JPA".
    Pour moi cela n'a pas de sens de décorréler JPA et EJB, JPA fait partie de la spécification EJB3 je cite:
    A major enhancement in EJB technology is the addition of the new Java Persistence API, which simplifies the entity persistence model and adds capabilities that were not in EJB 2.1 technology.
    Les mécanismes de persistance d'une "entité JPA" (tu as vu je fais des efforts ) et d'un EJB2.0 répondent aux mêmes contraintes.
    La grosse différence est que les EJB 2.0 de type entité devaient être gérés par un conteneur d'EJB alors que pour les entités EJB 3.0 la gestion est déléguée mais pour moi le principe reste le même.
    Bref on est d'accord sur beaucoup de choses mais pas sur la terminologie.

  17. #17
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Alors moi pour le "peu" que je connaisse de la techno J2EE, j'ai tendance à être d'accord avec les propos de DevServlet. Néanmoins, tout ça ne corrige pas mon problème :'( Même en fermant à chaque fois mon entity manager, j'ai l'erreur indiqué...

  18. #18
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    C'est probablement du au fait que j'ai travaillé avec des EJB2.0, donc pour moi une entité reste un EJB même en version 3.0, mais bon ce n'est pas cela qui résoudra ton problème.
    J'avoue que cela me laisse un peu perplexe, y-a-t-il quelque chose de particulier dans ton persistence.xml ?
    Est-ce que les logs de ton ORM disent quelque chose au démarrage de ton serveur ?

  19. #19
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,
    Peut on voir ton persistence.xml? le code d'une de tes entités mappées? et la classe dans laquelle tu instancies ton entityManagerFactory?
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  20. #20
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Bien sur:
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
      <persistence-unit name="xxxxxxx-busPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
          <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/xxxxxx_db"/>
          <property name="javax.persistence.jdbc.password" value=""/>
          <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
          <property name="javax.persistence.jdbc.user" value="root"/>
          <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
        </properties>
      </persistence-unit>
    </persistence>
    AbstractFacade:
    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    public abstract class AbstractFacade<T> {
     
        private Class<T> entityClass;
        private static final EntityManagerFactory EMF = Persistence.createEntityManagerFactory("XXX-busPU");
     
        public AbstractFacade(Class<T> entityClass) {
            this.entityClass = entityClass;
        }
     
        public void create(T entity) {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                entityManager.getTransaction().begin();
                entityManager.persist(entity);
                entityManager.getTransaction().commit();
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        public void create(Collection<T> entities) {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                entityManager.getTransaction().begin();
                for (T entity : entities) {
                    entityManager.persist(entity);
                }
                entityManager.getTransaction().commit();
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        public void edit(T entity) {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                entityManager.getTransaction().begin();
                entityManager.merge(entity);
                entityManager.getTransaction().commit();
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        public void remove(T entity) {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                entityManager.getTransaction().begin();
                entityManager.remove(entity);
                entityManager.getTransaction().commit();
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        public T find(Object id) {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                return entityManager.find(entityClass, id);
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        public List<T> findAll() {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
                cq.select(cq.from(entityClass));
                return entityManager.createQuery(cq).getResultList();
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        public List<T> findRange(int[] range) {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
                cq.select(cq.from(entityClass));
                Query q = entityManager.createQuery(cq);
                q.setMaxResults(range[1] - range[0]);
                q.setFirstResult(range[0]);
                return q.getResultList();
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        public int count() {
            EntityManager entityManager = null;
            try {
                entityManager = getEntityManager();
                CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
                Root<T> rt = cq.from(entityClass);
                cq.select(entityManager.getCriteriaBuilder().count(rt));
                Query q = entityManager.createQuery(cq);
                return ((Long) q.getSingleResult()).intValue();
            } finally {
                if (entityManager != null) {
                    entityManager.close();
                }
            }
        }
     
        protected EntityManager getEntityManager() {
            return EMF.createEntityManager();
        }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/01/2016, 17h44
  2. Réponses: 2
    Dernier message: 10/03/2011, 10h13
  3. Réponses: 0
    Dernier message: 29/10/2009, 11h53
  4. Réponses: 3
    Dernier message: 02/07/2008, 22h04
  5. Réponses: 3
    Dernier message: 16/06/2007, 00h57

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