Partage
  • Partager sur Facebook
  • Partager sur Twitter

[java] petite problème avec JPA helps please

netbeans

Sujet résolu
    17 janvier 2012 à 9:52:42

    Bonjour,
    j'ai un problème avec JPA j'explique :
    j'ai crée un projet sous netbeans "Java Application" , ensuite clic droite sur le package "class entité prevenant de la base de donnée" j'ai choisi la B.D c'est bon l'entité est crée avec les getter et setter et les attributs le la B.D ;)
    enfin clic droite sur le méme package "JPA Controller From Entity classes" et j'ai choisi l'entité crée tout à l'heure le fichier est généré avec les methodes d'interaction avec la B.D...
    enfin mon probléme c'est avec le constructeur de la class "TableeJpaController":

    public TableeJpaController(EntityManagerFactory emf){
    ...
    }
    


    par exemple pour inserer un enregistrement dans la base de donnée je doit instancier une entité dans la methode "Main" , dans mon exemple j'ai "Tablee" (Tablee aussi c'est le nom de la table de B.D avec deux attr id et nom) ensuite invoquer la methode "create(Tablee tablee)" de la classe "TableeJpaController" pour l'inserer :
    Tablee t = new Tablee(1,"marwen");
    //la suite ??
    

    une image de mon projet :
    Image utilisateur

    TableeJpaController
    ensuite je suis bloqué a ce stade car je ne connait pas comment instancier la classe "TableeJpaController"
    plutot comment instancier "EntityManagerFactory"... voilà
    Merci d'avance de votre aide j'attend vivement des réponses
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      17 janvier 2012 à 10:27:02

      L'entityManager peut être injecter par le conteneur EJB de ton serveur. (Si c'est un EJB bien sûr).
      @PersistenceContext(unitName="BankService")
      private EntityManager em;
      

      Si tu fait du lourd tu devras le faire toi même (peut être avec un peu d'aide de spring) !
      EntityManagerFactory emf = Persistence.createEntityManagerFactory("BankService"); //null
      EntityManager em = emf.createEntityManager();
      


      Il faut bien sûr que "BankService" soit déclaré au niveau de ton persistance.xml
      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2012 à 11:05:32

        Citation : angelsafrania

        L'entityManager peut être injecter par le conteneur EJB de ton serveur. (Si c'est un EJB bien sûr).

        @PersistenceContext(unitName="BankService")
        private EntityManager em;
        


        Si tu fait du lourd tu devras le faire toi même (peut être avec un peu d'aide de spring) !

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("BankService"); //null
        EntityManager em = emf.createEntityManager();
        



        Il faut bien sûr que "BankService" soit déclaré au niveau de ton persistance.xml







        une début de solution :) :

        public class Test {
        
            /**
             * @param args the command line arguments
             */
            public static void main(String[] args) throws PreexistingEntityException, Exception {
                // TODO code application logic here
                EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPU");
                Tablee t=new Tablee(5,"marwen");
                TableeJpaController tjc=new TableeJpaController(emf);
               
                    tjc.create(t);
                    System.out.println("succeed! l'objet est inséré");
                    
               
            }
        }
        




        ici "testPU" est déclaré dans mon fichier persistance.xml voyez plutôt:

        <?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="testPU" transaction-type="RESOURCE_LOCAL">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <class>test.Tablee</class>
            <properties>
              <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/xxx"/>
              <property name="javax.persistence.jdbc.password" value=""/>
              <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
              <property name="javax.persistence.jdbc.user" value="root"/>
              <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
            </properties>
          </persistence-unit>
        </persistence>
        


        lorsque j'exécute ce code un message d'erreur comme suit :


        [EL Info]: 2012-01-17 11:02:40.856--ServerSession(13786588)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
        [EL Severe]: 2012-01-17 11:02:40.871--ServerSession(13786588)--Local Exception Stack:
        Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
        Exception Description: Configuration error. Class [org.apache.derby.jdbc.ClientDriver] not found.
        Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
        Exception Description: Configuration error. Class [org.apache.derby.jdbc.ClientDriver] not found.
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:501)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:472)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:268)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277)
        at test.TableeJpaController.getEntityManager(TableeJpaController.java:30)
        at test.TableeJpaController.create(TableeJpaController.java:36)
        at test.Test.main(Test.java:28)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290)

        [EL Info]: 2012-01-17 11:02:40.871--ServerSession(13786588)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:268)
        [EL Severe]: 2012-01-17 11:02:40.871--ServerSession(13786588)--Local Exception Stack:
        at test.TableeJpaController.getEntityManager(TableeJpaController.java:30)
        at test.TableeJpaController.findTablee(TableeJpaController.java:121)
        Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
        at test.TableeJpaController.create(TableeJpaController.java:41)
        at test.Test.main(Test.java:28)
        Exception Description: Configuration error. Class [org.apache.derby.jdbc.ClientDriver] not found.
        Caused by: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        Exception Description: Configuration error. Class [org.apache.derby.jdbc.ClientDriver] not found.
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.exceptions.DatabaseException.configurationErrorClassNotFound(DatabaseException.java:82)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.sessions.DefaultConnector.loadDriverClass(DefaultConnector.java:267)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:85)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:472)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:472)
        ... 8 more
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:268)
        at test.TableeJpaController.getEntityManager(TableeJpaController.java:30)
        at test.TableeJpaController.findTablee(TableeJpaController.java:121)
        at test.TableeJpaController.create(TableeJpaController.java:41)
        at test.Test.main(Test.java:28)

        Java Result: 1




        Merci !
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 janvier 2012 à 11:19:06

          Citation : marwen109



          Exception Description: Configuration error. Class [org.apache.derby.jdbc.ClientDriver] not found.



          Ton driver n'a pas été trouvé. Enfin ton Jar connecteur.
          Tu as configuré ton persistance.xml avec Deby mais tu n'as pas le Jar JDBC qui correspond dans ton classe Path.

          C'est ici que tu l'as indiqué

          Citation : marwen109


          <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
          


          • Partager sur Facebook
          • Partager sur Twitter
            17 janvier 2012 à 19:00:19

            MERCI ça marche !
            j'ai un autre problème que je ne comprend pas :
            lorsque j'exécute le code il affiche un message "succeed! l'objet est inséré" et l'objet est inséré dans la B.D MAIS il écrase tous les anciens enregistrement et puis il insère,j'ai changé la methode en "tjc.getPersonneCount()" pour que je vérifie le nbr d'enreg mais il me retourne 0, bref chaque fois que j'exécute le programme il vide la table o_O , voilà mon projet:


            TesTT.java (le programme principale) :

            package testt;
            
            import javax.persistence.EntityManagerFactory;
            import javax.persistence.Persistence;
            import testt.exceptions.PreexistingEntityException;
            
            /**
             *
             * @author marwen
             */
            public class Testt {
            
                /**
                 * @param args the command line arguments
                 */
                public static void main(String[] args) throws PreexistingEntityException, Exception {
                    
                    
                    EntityManagerFactory emf = Persistence.createEntityManagerFactory("testtPU");
                    Personne p=new Personne(2);
                    p.setNom("marwen");
                    PersonneJpaController tjc=new PersonneJpaController(emf);
                   
                        tjc.create(p);
                       
                        System.out.println("succeed! l'objet est inséré");
                }
            }
            



            Personne.java (c'est l'entité personne provenant de la base de donnée):

            /*
             * To change this template, choose Tools | Templates
             * and open the template in the editor.
             */
            package testt;
            
            import java.io.Serializable;
            import javax.persistence.*;
            import javax.xml.bind.annotation.XmlRootElement;
            
            /**
             *
             * @author marwen
             */
            @Entity
            @Table(name = "PERSONNE", catalog = "", schema = "ROOT")
            @XmlRootElement
            @NamedQueries({
                @NamedQuery(name = "Personne.findAll", query = "SELECT p FROM Personne p"),
                @NamedQuery(name = "Personne.findById", query = "SELECT p FROM Personne p WHERE p.id = :id"),
                @NamedQuery(name = "Personne.findByNom", query = "SELECT p FROM Personne p WHERE p.nom = :nom")})
            public class Personne implements Serializable {
                private static final long serialVersionUID = 1L;
                @Id
                @Basic(optional = false)
                @Column(name = "ID", nullable = false)
                private Integer id;
                @Column(name = "NOM", length = 30)
                private String nom;
            
                public Personne() {
                }
            
                public Personne(Integer id) {
                    this.id = id;
                }
            
                public Integer getId() {
                    return id;
                }
            
                public void setId(Integer id) {
                    this.id = id;
                }
            
                public String getNom() {
                    return nom;
                }
            
                public void setNom(String nom) {
                    this.nom = nom;
                }
            
                @Override
                public int hashCode() {
                    int hash = 0;
                    hash += (id != null ? id.hashCode() : 0);
                    return hash;
                }
            
                @Override
                public boolean equals(Object object) {
                    // TODO: Warning - this method won't work in the case the id fields are not set
                    if (!(object instanceof Personne)) {
                        return false;
                    }
                    Personne other = (Personne) object;
                    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
                        return false;
                    }
                    return true;
                }
            
                @Override
                public String toString() {
                    return "testt.Personne[ id=" + id + " ]";
                }
                
            }
            


            PersonneJpaController.java(généré a partir de l'entité Personne)

            /*
             * To change this template, choose Tools | Templates
             * and open the template in the editor.
             */
            package testt;
            
            import java.io.Serializable;
            import java.util.List;
            import javax.persistence.EntityManager;
            import javax.persistence.EntityManagerFactory;
            import javax.persistence.Query;
            import javax.persistence.EntityNotFoundException;
            import javax.persistence.criteria.CriteriaQuery;
            import javax.persistence.criteria.Root;
            import testt.exceptions.NonexistentEntityException;
            import testt.exceptions.PreexistingEntityException;
            
            /**
             *
             * @author marwen
             */
            public class PersonneJpaController implements Serializable {
            
                public PersonneJpaController(EntityManagerFactory emf) {
                    this.emf = emf;
                }
                private EntityManagerFactory emf = null;
            
                public EntityManager getEntityManager() {
                    return emf.createEntityManager();
                }
            
                public void create(Personne personne) throws PreexistingEntityException, Exception {
                    EntityManager em = null;
                    try {
                        em = getEntityManager();
                        em.getTransaction().begin();
                        em.persist(personne);
                        em.getTransaction().commit();
                    } catch (Exception ex) {
                        if (findPersonne(personne.getId()) != null) {
                            throw new PreexistingEntityException("Personne " + personne + " already exists.", ex);
                        }
                        throw ex;
                    } finally {
                        if (em != null) {
                            em.close();
                        }
                    }
                }
            
                public void edit(Personne personne) throws NonexistentEntityException, Exception {
                    EntityManager em = null;
                    try {
                        em = getEntityManager();
                        em.getTransaction().begin();
                        personne = em.merge(personne);
                        em.getTransaction().commit();
                    } catch (Exception ex) {
                        String msg = ex.getLocalizedMessage();
                        if (msg == null || msg.length() == 0) {
                            Integer id = personne.getId();
                            if (findPersonne(id) == null) {
                                throw new NonexistentEntityException("The personne with id " + id + " no longer exists.");
                            }
                        }
                        throw ex;
                    } finally {
                        if (em != null) {
                            em.close();
                        }
                    }
                }
            
                public void destroy(Integer id) throws NonexistentEntityException {
                    EntityManager em = null;
                    try {
                        em = getEntityManager();
                        em.getTransaction().begin();
                        Personne personne;
                        try {
                            personne = em.getReference(Personne.class, id);
                            personne.getId();
                        } catch (EntityNotFoundException enfe) {
                            throw new NonexistentEntityException("The personne with id " + id + " no longer exists.", enfe);
                        }
                        em.remove(personne);
                        em.getTransaction().commit();
                    } finally {
                        if (em != null) {
                            em.close();
                        }
                    }
                }
            
                public List<Personne> findPersonneEntities() {
                    return findPersonneEntities(true, -1, -1);
                }
            
                public List<Personne> findPersonneEntities(int maxResults, int firstResult) {
                    return findPersonneEntities(false, maxResults, firstResult);
                }
            
                private List<Personne> findPersonneEntities(boolean all, int maxResults, int firstResult) {
                    EntityManager em = getEntityManager();
                    try {
                        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
                        cq.select(cq.from(Personne.class));
                        Query q = em.createQuery(cq);
                        if (!all) {
                            q.setMaxResults(maxResults);
                            q.setFirstResult(firstResult);
                        }
                        return q.getResultList();
                    } finally {
                        em.close();
                    }
                }
            
                public Personne findPersonne(Integer id) {
                    EntityManager em = getEntityManager();
                    try {
                        return em.find(Personne.class, id);
                    } finally {
                        em.close();
                    }
                }
            
                public int getPersonneCount() {
                    EntityManager em = getEntityManager();
                    try {
                        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
                        Root<Personne> rt = cq.from(Personne.class);
                        cq.select(em.getCriteriaBuilder().count(rt));
                        Query q = em.createQuery(cq);
                        return ((Long) q.getSingleResult()).intValue();
                    } finally {
                        em.close();
                    }
                }
                
            }
            



            enfin persistance.xml:

            <?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="testtPU" transaction-type="RESOURCE_LOCAL">
                <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
                <class>testt.Personne</class>
                <properties>
                  <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/personne"/>
                  <property name="javax.persistence.jdbc.password" value="1234"/>
                  <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
                  <property name="javax.persistence.jdbc.user" value="root"/>
                  <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
                </properties>
              </persistence-unit>
            </persistence>
            




            Remarque: le Personne.java et PersonneJpaController.java est généré par netbeans a partir la base de donnée j'ai écrit seulement la class Testt.java.

            j'ai crée 5 projets et sans résultat... j'ai passé toute la journée devant cette erreur :/
            Merci encore pour votre support ^_^
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              17 janvier 2012 à 22:31:57

              Citation : marwen109


              <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
              

              C'est écrit la ^^. C'est dit efface mes table et crée les.
              Donc tu enlèves la ligne et ça marche si tes tables sont déjà crée.
              • Partager sur Facebook
              • Partager sur Twitter
                18 janvier 2012 à 11:22:58

                Bonjour,
                Merci ^^ , enfin ça marche ,bon c'est mon premier application avec JPA j'ai pas lu même pas la doc,donc c'est assez logique que je rencontre ce type de problème :euh: ...
                Merci encore :D
                • Partager sur Facebook
                • Partager sur Twitter
                  21 janvier 2012 à 1:58:11

                  Bonsoir,
                  j'ai encore un petit problème , j’espère que tu va m'aider:
                  j'ai crée un jar exécutable ,à chaque fois(exécution) il se connecte a la base de donnée(C:\MA_BASE , puisque apache derby est portable ^^) et reste en écoute,ensuite, des utilisateurs se connectent via internet a mon petit serveur et invoquent ses méthodes à distance( avec RMI), heureusement ça marche sous netbeans , mais au dehors :/ voyez plutôt:

                  aprés l'exécution de :

                  java -jar jarre.jar

                  j'ai reçu ces messages d'erreurs:
                  Image utilisateur


                  je veux déployer mon jar comme un serveur sur mon pc , et des utilisateurs se connectent a mon application via internet.... si tu peut me renseigner comment déployer mon app chez moi :euh: , j'utilise "apache derby" comme SGBD.

                  merci d'avoir le temps pour m'écrire, merci vivement...
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    22 janvier 2012 à 14:16:13

                    La j'ai un peu de mal à te dire hors mis le fait qu'il arrive pas à crée une socket donc peut être que ton part feu windob l'empêche de le faire.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 janvier 2012 à 14:56:26

                      salut,
                      le problème est résolu, j'ai changé l'SGBD H2DB est plus simple et ça marche ;) ,
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [java] petite problème avec JPA helps please

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown