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 :

probleme avec un bean entité et persistance lors d'un clique sur bouton [EJB3]


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut probleme avec un bean entité et persistance lors d'un clique sur bouton
    Salut tout le monde
    voila j'ai commencé à me familiariser avec les java beans et j'ai voulu developper une petite partie d'une application
    dans cette partie j'ai conçu un entité bean, un session bean qui le controle et un JSF Managed bean une jsp qui s'occupe des l'affichage et qui contient un formulaire où je saisie les propriétés de mon entity bean sauf que j'ai un probleme lors du clique sur un bouton une action doit se declancher celle de persister mon bean et ainsi voir le resultat sur la table de ma base de données
    mais le prob c que lors du clique sur le bouton rien ne s'enregistre sur ma table et je pense que soit mon bean a un id null soit une mauvaise manipulation de la requete jsf mais je pense à 80% que c le premier cas voila mon code

    entité:
    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
    import javax.persistence.Table;
     
    /**
     *
     * @author Administrateur
     */
    @Entity
    @Table(name = "agence")
    @NamedQueries({@NamedQuery(name = "Agence.findByIdAgence", query = "SELECT a FROM Agence a WHERE a.idAgence = :idAgence"), @NamedQuery(name = "Agence.findByNomAgence", query = "SELECT a FROM Agence a WHERE a.nomAgence = :nomAgence"), @NamedQuery(name = "Agence.findByAdresseAgence", query = "SELECT a FROM Agence a WHERE a.adresseAgence = :adresseAgence"), @NamedQuery(name = "Agence.findByTelephoneAgence", query = "SELECT a FROM Agence a WHERE a.telephoneAgence = :telephoneAgence")})
    public class Agence implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id_agence", nullable = false)
        private Integer idAgence;
        @Column(name = "nom_agence")
        private String nomAgence;
        @Column(name = "adresse_agence")
        private String adresseAgence;
        @Column(name = "telephone_agence")
        private String telephoneAgence;
     
        public Agence() {
        }
     
        public Agence(Integer idAgence) {
            this.idAgence = idAgence;
        }
     
        public Integer getIdAgence() {
            return idAgence;
        }
     
        public void setIdAgence(Integer idAgence) {
            this.idAgence = idAgence;
        }
     
        public String getNomAgence() {
            return nomAgence;
        }
     
        public void setNomAgence(String nomAgence) {
            this.nomAgence = nomAgence;
        }
     
        public String getAdresseAgence() {
            return adresseAgence;
        }
     
        public void setAdresseAgence(String adresseAgence) {
            this.adresseAgence = adresseAgence;
        }
     
        public String getTelephoneAgence() {
            return telephoneAgence;
        }
     
        public void setTelephoneAgence(String telephoneAgence) {
            this.telephoneAgence = telephoneAgence;
        }
     
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (idAgence != null ? idAgence.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 Agence)) {
                return false;
            }
            Agence other = (Agence) object;
            if ((this.idAgence == null && other.idAgence != null) || (this.idAgence != null && !this.idAgence.equals(other.idAgence))) {
                return false;
            }
            return true;
        }
     
        @Override
        public String toString() {
            return "entitebean.Agence[idAgence=" + idAgence + "]";
        }
     
    }
    session:
    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 template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package sessionbean;
     
    import entitebean.Agence;
    import javax.annotation.Resource;
    import javax.ejb.Stateless;
    import javax.ejb.TransactionManagement;
    import javax.ejb.TransactionManagementType;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.transaction.UserTransaction;
     
    /**
     *
     * @author Administrateur
     */
    @Stateless
    @TransactionManagement(TransactionManagementType.BEAN)
    public class sessionbeanBean implements sessionbeanRemote {
        @PersistenceContext(unitName="Stage-ejbPU")
        EntityManager persistance;
        @Resource
        private UserTransaction utx;
        // Add business logic below. (Right-click in editor and choose
        // "EJB Methods > Add Business Method" or "Web Service > Add Operation")
        public sessionbeanBean(){}
        public void setAgence(){
            Agence agence=new Agence();
            persistance.persist(agence);
        }
        public void modifier(Agence agence){
            persistance.merge(agence);
        }
        public void supprimer(Agence agence){
            persistance.remove(agence);
        }
        public Agence rechercher(Integer id){
            return persistance.find(Agence.class, id);
        }
        public void save(Agence agence) throws Exception {
     
            try {
     
                utx.begin();
                persistance.joinTransaction();
                persistance.persist(agence);
     
                utx.commit();
            } catch (Exception ex) {
                try {
                     utx.rollback();
                     throw new Exception(ex.getLocalizedMessage());
                } catch (Exception e) {
                 throw new Exception(e.getLocalizedMessage());
                }
            } finally {
                persistance.close();
            }
         }
    }
    managed bean:

    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package bean;
     
    import entitebean.Agence;
    import javax.faces.application.FacesMessage;
    import javax.faces.context.FacesContext;
     
    import sessionbean.sessionbeanBean;
     
     
     
    /**
     *
     * @author Administrateur
     */
     
    public class NewJSFManagedBean {
     
        private sessionbeanBean session=new sessionbeanBean();
        private Agence agence=new Agence();
        /** Creates a new instance of NewJSFManagedBean */
        public NewJSFManagedBean() {
     
        }
        public void setSessionbeanBean(sessionbeanBean session){
            this.session=session;
        }
        public sessionbeanBean getSessionbeanBean(){
            return session;
        }
        public void setAgence(Agence agence){
            this.agence=agence;
        }
        public Agence getAgence(){
            return agence;
        }
        public String save() {
            try {
                this.session.save(agence);
                addSuccessMessage("Success");
                 } 
             catch (Exception ex) {
                    addErrorMessage(ex.getLocalizedMessage());
             }
          return "oui";
        }
       public static void addErrorMessage(String msg) {
            FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
            FacesContext fc = FacesContext.getCurrentInstance();
            fc.addMessage(null, facesMsg);
        }
     
        public static void addSuccessMessage(String msg) {
            FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
            FacesContext fc = FacesContext.getCurrentInstance();
            fc.addMessage("successInfo", facesMsg);
        }
    }
    ma jsp:

    .....
    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
    <h:form>
        <table width="450" border="0">
      <tr>
        <th scope="row">&nbsp; <h:outputText value="Nom de l'agence :" /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <td><h:inputText id="nomAgence" value="#{NewJSFManagedBean.agence.nomAgence}" title="Nom de l'agence" /></td>
      </tr>
      <tr>
          <th scope="row"> &nbsp;<h:outputText value="Adresse de l'agence :" /> &nbsp; </th>
          <td><h:inputTextarea id="adresseAgence" value="#{NewJSFManagedBean.agence.adresseAgence}" title="Adresse de l'agence" rows ="2" cols="15" /> </td>
      </tr>
      <tr>
          <th scope="row">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<h:outputText value="Téléphone de l'agence :" /> &nbsp;</th>
          <td><h:inputText id="telephoneAgence" value="#{NewJSFManagedBean.agence.telephoneAgence}" title="Téléphone de l'agence" /></td>
      </tr>
      <tr>
        <th>&nbsp;&nbsp;</th>
        <td>&nbsp;<h:commandButton action="#{NewJSFManagedBean.save}" value="Enregistrer" /><input name="Effacer" type="reset" value="Effacer">&nbsp;</td>
      </tr>
    </table>
    </h:form>
    .....


    j'espere avoir de l'aide et je vous remercie



    j'attend toujours vos reponses je travaille encore là dessus et jusqu'à maintenant je trouve pas de solution svp que qlq1 me reponde car je suis vraiment bloqué

  2. #2
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    Alors que le fait que l'id de l'entity est null est normal puisque tu utilises une stratégie de génération de la clé (annotation sur ton id)

    Par contre tu fais l'erreur d'instancier ton EJB dans ton managed Bean.
    Il ne faut jamais faire un new, mais utiliser soit l'injection, soit faire un lookup JNDI. (attention l'injection d'ejb dans un managedbean ne marche que en JSF 1.2 et par exemple ne marche pas dans Weblogic)

    Dans ton managed bean remplace la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      private sessionbeanBean session=new sessionbeanBean();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      @EJB private sessionbeanBean session;
    Enfin, je te recommande de laisser le container d'EJB gerer la transaction, la gestion manuelle est vraiment très rare

  3. #3
    Membre averti
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    Merci enormement Christophe d'avoir repondu à mon post

    svp vous pouvez me montrer comment faire un lookup pour mon exemple.

    et je tiens à préciser que l'annotation @EJB me crée des problemes quand je la supprime l'affichage de ma JSP se fait correctement.

    et je sais pas si vous avez remarquez que je fais aussi une instanciation de mon bean entité aussi est-ce correct de l'instancier dans mon managed bean?

    pour la gestion de transaction vous avez raison j'ai lu que c pas obligatoire puisque le conteneur s'en charge.

    j'attendrais votre reponse et je vous remercie encore une fois.

  4. #4
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    Si la JSP ne s'affiche pas il y a sans doute une erreur sur l'écran ou alors dans les logs qui pourrait nous aider a avancer

    Au nom de l'interface implémentée par l'EJB, il semble que vous ayez choisi de faire du Remote.
    Pour un managedBean, on peut utiliser une interface Local.

    Quel est le serveur utilisé? L'injection des EJB dans les ManagedBean ne marche pas sur Weblogic...

    Pour le new sur l'entity, c'est ce qu'il faut faire.

  5. #5
    Membre averti
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    Merci enormement pour vos reponse et pour votre aide

    donc je dois comprendre que je dois utiliser @Local au lieu du @Remote donc pas d'appel à distance.

    et comme serveur j'utilise Glassfish v2.

    et svp concernant le lookup ou l'injection comment faire?

    merci pour vos reponses et j'attend votre prochaine reponse je vous remercie encore une fois

  6. #6
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    L'interface Remote force une sérialisation des objets par le réseau avec appel via RMI entre deux JVM
    L'interface Local permet d'appeler au sein d'une même JVM ce qui est le cas d'un serveur. Il est donc préférable dans votre cas de passer par l'interface local.
    Donc oui, il faut remplacer @Remote par @Local.
    Ensuite l'injection ne nécessite rien de plus que la ligne que j'ai donné plus haut moyennant une correction, il faut déclarer une référence à l'interface Local:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @EJB private sessionbeanLocal session;
    Pour le lookup, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Context ctx = new InitialContext();
    sessionbeanLocal session = (sessionbeanLocal) ctx.lookup("sessionbeanBean");

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/03/2013, 02h08
  2. EJB3 Bean entité et persistance
    Par maparè dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 0
    Dernier message: 08/02/2010, 10h38
  3. Réponses: 4
    Dernier message: 08/07/2008, 22h39
  4. probleme avec les beans
    Par midou84 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/06/2008, 21h27
  5. Réponses: 10
    Dernier message: 30/07/2007, 18h42

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