[EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  Jiraiya-08 le Lun 03 Jan 2011, 19:27

Bonsoir !

Tout d'abord, bonne et heureuse année à tout le monde ! Smile

Mais revenons à nos montons... Je développe un projet CPA utilisant les technologies Java Persistance et EJB (plus précisément des SessionBean). Dans la base de donnée, j'ai entre autre les 2 tables suivantes:
- Client
- Adresse

Ces 2 Tables sont "mappés" par des classes entités, et les ID des nouvelles entrées sont géré par la BD elle même, grâce à la clause suivante:
Code:
create table projetcpa.CLIENT(
   ns_client_id         integer       PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1)
Là où se situe mon problème, c'est lors de l'ajout d'un client. Je crée une nouvelle adresse, puis un nouvel objet client avec l'adresse que j'ai créé, sans toucher à l'ID (=0) d'aucune des deux classes, puis je vérifie les informations. Une fois les informations validés, je persist le client de cette manière :

Code:
em.persist(client);

Les nouvelles informations sont bien ajoutées à la base de données, avec des ID correctes (1, 2, 3 ...), mais les attributs ID des entités que j'ai persisté ne sont pas modifiés, et restent donc à 0.
L'EntityManager est géré par l'EJB, aucun problème la dessus, vu que tout fonctionne parfaitement pour les autres méthodes. Les entités ont été générés automatiquement, et les ID ont bien les tags pour la génération automatique:

Code:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "NS_CLIENT_ID")
private Integer nsClientId;

Je n'y comprends rien. Merci pour votre aide Smile


Dernière édition par Jiraiya-08 le Lun 10 Jan 2011, 01:29, édité 4 fois

Jiraiya-08

Nombre de messages : 111
Age : 28
Prénom : Georges
Statut : Ancien - Promo 2010
Localisation : Rapture
Date d'inscription : 13/10/2007

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  kamel0074 le Lun 03 Jan 2011, 19:44

Salut ,
je pense que si tu fais :
Code:

em.persist(client);
client = em.merge(client);

cela devrait fonctionner si je me trompe pas Very Happy

kamel0074

Nombre de messages : 18
Age : 27
Prénom : kamel
Statut : étudiant en 3ème gestion[2010-2011]
Date d'inscription : 25/09/2008

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  Jiraiya-08 le Lun 03 Jan 2011, 20:02

Merci pour ton aide, mais ca n'a pas marché, j'ai toujours 0 dans l'ID.

Par contre, je viens de voir qu'en retournant le client:

Code:
em.persist(c);
return c;

Et en faisant dans le main:

Code:
client = clientEJB.ajouterClient(client);

Là ça marche. Par contre je comprends toujours pas pourquoi. Shocked
En plus je ne peux pas détacher après le persist, vu que dès que je le fait, j'ai de nouveau 0 comme ID.

Code:
em.persist(c);
em.detach(c);
return c;

Jiraiya-08

Nombre de messages : 111
Age : 28
Prénom : Georges
Statut : Ancien - Promo 2010
Localisation : Rapture
Date d'inscription : 13/10/2007

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  pbt le Mar 04 Jan 2011, 14:40

N'est-ce pas une belle illustration du passage de paramètre par valeur en Java ?

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  Jiraiya-08 le Mar 04 Jan 2011, 15:04

En java c'est bien par valeur pour les types "standard" (types primitifs, String, etc) et par référence pour les autres objets ?
Là j'ai l'impression que le problème se situe plus au niveau de la portée de l'EntityManager, mais peut être que je me trompe...






Jiraiya-08

Nombre de messages : 111
Age : 28
Prénom : Georges
Statut : Ancien - Promo 2010
Localisation : Rapture
Date d'inscription : 13/10/2007

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  Abdel le Mer 05 Jan 2011, 01:01

Salut,

Tu peux mettre le code de ton ClientEJB ?

J'ai une petite idée sur le problème mais il me faudrait le code pour etre sur de ce que je pense.


Merci

Abdel

Nombre de messages : 13
Age : 27
Prénom : Abdel
Statut : Ancien( Diplômé en 2011 )
Localisation : Namur
Date d'inscription : 04/12/2008

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  Jiraiya-08 le Mer 05 Jan 2011, 01:14

Voilà le code en partie:

Code:
/*
package be.heb.esi.cpa.g30613.business;

import be.heb.esi.cpa.g30613.entity.Adresse;
import be.heb.esi.cpa.g30613.entity.Client;
import be.heb.esi.cpa.g30613.entity.Pays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
@LocalBean
public class ClientEJB{
    @PersistenceContext(unitName = "SomeWare-ejbPU")
    private EntityManager em;

    public Client ajouterClient(Client c) throws SomeWareException{
        if(c == null)
            throw new SomeWareException("Le client est NULL");
        if(! Validation.estEmailFormatValide(c.getEmail()))
            throw new SomeWareException("L'email est invalide.");
        if(estEmailExistant(c.getEmail()))
            throw new SomeWareException("L'email a déjà été enregistré pour un autre membre !");
        if(! Validation.estPseudoFormatValide(c.getPseudo()))
            throw new SomeWareException("Le pseudo est invalide.");
        if(estPseudoExistant(c.getPseudo()))
            throw new SomeWareException("Le pseudo existe déjà.");
        if(! Validation.estPasswordValide(c.getPassword()))
            throw new SomeWareException("Le mot de passe est invalide !");
        if(! Validation.estChaineAlphabetiqueValide(c.getNom()))
            throw new SomeWareException("Le nom est invalide.");
        if(! Validation.estChaineAlphabetiqueValide(c.getPrenom()))
            throw new SomeWareException("Le prénom est invalide.");
        if(! Validation.estAdresseValide(c.getAdresse(), this.em))
            throw new SomeWareException("L'adresse est invalide !");

        try{
            em.persist(c);
       return c;
        }catch(Exception ex){
            Logger.getLogger(ClientEJB.class.getName()).log(Level.SEVERE, null, ex);
            throw new SomeWareException("Impossible d'enregistrer le nouveau client...\n"+ex.getMessage());
        }
    }// end - ajouterClient

}//end - ClientEJB

Encore merci Smile

Jiraiya-08

Nombre de messages : 111
Age : 28
Prénom : Georges
Statut : Ancien - Promo 2010
Localisation : Rapture
Date d'inscription : 13/10/2007

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  aro le Mer 05 Jan 2011, 08:49

J'essayerais
Code:
em.refresh(c);
après
Code:
em.persist(c);

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: [EJB-JPA-JTA] Java Persistance: ID d'un élément persisté

Message  Contenu sponsorisé Aujourd'hui à 20:43


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum