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 :

[netbeans,hibernate] erreur dans un persist


Sujet :

JPA Java

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut [netbeans,hibernate] erreur dans un persist
    bonjour,

    je lis actuellement un tuto de S. Tahé sur j2ee, dans lequel il est demandé de créer l'équivalant des opérations CRUD en JPQL, mais j'obtiens une erreur sur un persist.

    En fait j'ai deux questions:

    1/de manière théorique, je suis un peu perdu par l'opération persist, qui ne rend rien (void). Supposons (comme ce sera le cas pour ma classe "cotisation") que j'ai une classe avec plusieurs champs: id (clé primaire), version (pour JPA : version), et disons nom (string). ce que je fais c'est que je créé un nouvel objet en remplissant uniquement le champ "nom", je laisse id et version à 0. Ensuite je fais le persist et puyisque j'ai ajouté l'annotation "@GeneratedValue...auto" (je n'ai plus les détails) normalement la version et la clé primaire devraient être mises à jour.
    ma question théorique est la suivante: je fais le presist et si tout marche l'objet se retrouve dans la base, alors comment puis-je le retrouver, puisque le seul moyen c'est par la clé primaire que je n'ai pas car persist ne rend rien?
    dois-je faire une requête sur tous les autres champs?

    2/je reprends le cas précédent, car j'obtiens une erreur du compilateur, voici les fichiers concernés:

    cotisation.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
     
    (...)
    @Entity
    public class cotisation implements Serializable{
     
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private int id;
     
        @Version
        private int version;
     
        @Column
        private float csgrds;
     
        @Column
        private float csgd;
     
        @Column
        private float secu;
     
        @Column
        private float retraite;
     
        public cotisation() {
        }
     
        public cotisation(float csgrds, float csgd, float secu, float retraite) {
     
            this.csgrds = csgrds;
            this.csgd = csgd;
            this.secu = secu;
            this.retraite = retraite;
        }
    (...)
    cotisation_dao.java (voir aussi + bas)

    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
     
    (...)
     
    @Transactional
    public class cotisation_dao implements ICotisationDao {
     
        @PersistenceContext
        private EntityManager em;
     
        // retour: l'entité persistée
        // exceptions: l'entité existe déjà, ze_cotisation n'est pas valide
        public cotisation create(cotisation ze_cotisation) {
     
            cotisation sortie = null;
            try {
                int svg_clé = ze_cotisation.getId();
                em.persist(ze_cotisation);
                sortie = em.find(cotisation.class, svg_clé);
            } catch (EntityExistsException e) {
                throw new PamException("Erreur dans dao/cotisation_dao/create - opération persist", 1);
     
            } //catch (Exception e) {
              //  System.out.println(e.toString());
                //throw new PamException("Erreur dans dao/cotisation_dao/create - opération persist", 2);
     
            //}
     
            return sortie;
        }
    (...)
    cotisation_dao c'est l'implémentation d'une interface ICotisationDao, c'est la partie du programme qui gère les appels à la base, pour la classe cotisation (voir le code + bas), je sais que ce code n'est pas bon (l'id doit changer lors de l'opération persist)

    ICotisationDao.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    (...)
    public interface ICotisationDao {
     
        public cotisation create(cotisation cotisation);
        public cotisation edit(cotisation cotisation);
        public void destroy(cotisation cotisation);
        public cotisation find_id (int id);
        public List<cotisation> findAll();
     
    }
    voilà, j'ai tout mis, ah non, j'oubliais l'erreur:

    Exception in thread "main" java.lang.NullPointerException
    at intro_j2ee.dao.cotisation_dao.create(cotisation_dao.java:34)
    at intro_j2ee.main.Main.main(Main.java:32)
    Java Result: 1
    l'erreur se situe dans la ligne du persist de cotisation_dao.

    lolveley.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2008
    Messages : 33
    Par défaut
    Bonjour,
    J'ai une piste à te proposer, mais je ne garantis rien. Quand tu crées ton objet cotisation, et que tu le passes à la fonction create, tu commence par récupérer son id avant de le persister. Tu récupères donc un id nul et tu ne peux pas ensuite retrouver ton objet (une fois persisté, son id n'est plus nul, puisque tu as mis l'annotation @GeneratedValue). As-tu vérifié en base si ton objet était bien persisté?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    j'ai bien verifié mais la table cotisation est vide.
    pour l'id, tu as raison, l'id est modifié lors du persist.

    lolveley.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    une première solution: avec ce code:

    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
     
    public cotisation create(cotisation ze_cotisation) {
     
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("intro_J2EEPU");
            EntityManager em = emf.createEntityManager();
            cotisation sortie = null;
            float ze_csgrds = ze_cotisation.getCsgrds();
            float ze_csgd = ze_cotisation.getCsgd();
            float ze_secu = ze_cotisation.getSecu();
            float ze_retraite = ze_cotisation.getRetraite();
            List<cotisation> liste;
     
            try {
                em.getTransaction().begin();
                em.persist(ze_cotisation);
                em.getTransaction().commit();
     
     
            } catch (EntityExistsException e) {
                throw new PamException("Erreur dans dao/cotisation_dao/create - opération persist", 1);
     
            } catch (Exception e) {
                System.out.println(e.toString());
                throw new PamException("Erreur dans dao/cotisation_dao/create - opération persist", 2);
     
            }
     
            try {
                Query query = em.createQuery("select c from cotisation c where c.csgrds=:csgrds and c.csgd=:csgd and c.secu=:secu and c.retraite=:retraite");
                //Query query = em.createNativeQuery("select * from cotisation where csgrds='"+ze_csgrds+"' and csgd='"+ze_csgd+"' and secu='"+ze_secu+"' and retraite='"+ze_retraite+"'");
                query.setParameter("csgrds", ze_csgrds);
                query.setParameter("csgd", ze_csgd);
                query.setParameter("secu", ze_secu);
                query.setParameter("retraite", ze_retraite);
                liste = query.getResultList();
            } catch (Exception e) {
                System.out.println(e.toString());
                throw new PamException("Erreur dans dao/cotisation_dao/create - opération query", 2);
            }
     
     
     
            sortie=liste.get(0);
     
            return sortie;
        }
    j'arrive à obtenir l'objet persisté.
    mais il y a une chose que je ne pige pas: si l'objet n'est pas dans le contexte la requête createNativeQuery ne rend rien, même si l'objet est dans la base, or j'ai lu dans un tuto que createNativeQuery recherche dans la base...sinon y-a-t'il un moyen de faire des recherches (requêtes) dans la bdd?

    en fait, si l'objet ze_cotisation est dans le contexte (par exemple si j'ai fait un drop-create de la base suivi d'un persist) createNativeQuery trouve l'objet, et dans l'autre cas (objet dans la base mais pas dans le contexte) elle ne le trouve pas.




    lolveley.

Discussions similaires

  1. Hibernate Javadoc dans NetBeans
    Par fraco dans le forum NetBeans
    Réponses: 1
    Dernier message: 27/09/2012, 20h07
  2. Réponses: 2
    Dernier message: 20/05/2012, 18h25
  3. Erreur dans la génération du fichier WSDL sous Netbeans
    Par ebenmous dans le forum Services Web
    Réponses: 11
    Dernier message: 12/05/2011, 19h38
  4. Réponses: 1
    Dernier message: 15/12/2010, 17h02
  5. Erreur dans mon code avec HIBERNATE
    Par top_eagle dans le forum Hibernate
    Réponses: 5
    Dernier message: 19/10/2009, 10h50

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