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

Développement Web en Java Discussion :

Impossible d'insérer sans recharger la page (séquence n'incrémente pas)


Sujet :

Développement Web en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut Impossible d'insérer sans recharger la page (séquence n'incrémente pas)
    Bonjour à tous,

    Je développe un outil avec Java EE et l'un de mes formulaires permet de gérer l'intitulé d'une liste déroulante.

    Tout fonctionne très bien (insertion, modif, suppression) mais lorsque je veux faire plusieurs insertions de suite, cela ne marche pas parce que j'essaie d'insérer avec la même valeur de séquence (je me demande pourquoi il ne va pas chercher le nextval). L'insertion refonctionne si on rafraîchit la page.

    J'ai essayé de modifier le type de séquence utilisé par JPA et d'autres choses, je tâtonne un peu car je suis assez nouveau avec l'utilisation de JSF/JPA.

    J'ai trouvé énormément d'exemples qui fonctionnent en utilisant le même code que moi mais de mon côté ca ne veut pas...

    J'aurais donc besoin de votre aide car il y a sûrement quelque chose que j'ai mal fait. Je pensais régler tout cela en utilisant un trigger mais bon une séquence est censée faire le boulot normalement !

    Merci d'avance pour votre aide et n'hésitez pas à me demander des précisions si je ne suis pas clair !

    Le formulaire :

    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
    	<h:form id="formulaire">
     
    		<p:growl id="messages" showDetail="true"/>
     
    			<p:panel header="Création d'une absence" toggleable="true" toggleSpeed="500"> 
     
    				<h:outputLabel for="cause">Cause d'absence <span class="requis">*</span></h:outputLabel>
     
    				<p:inputText id="cause" value="#{gestionAbsenceBean.absence.cause}" size="20" maxlength="30">
    					<f:ajax event="blur" render="causeMessage" update=":formulaire:messages"/>
    					<!-- f:validator binding="#{existenceAbsenceValidator}" /> -->
    				</p:inputText>
     
    				<h:message id="causeMessage" for="cause" errorClass="erreur" /><br />
     
     
     
    				 <p:commandButton value="Créer" action="#{gestionAbsenceBean.creation}" update=":formulaire2:listeAbsences :formulaire:messages" process="@form" ajax="true">
    				 </p:commandButton>
    				<br />
    			</p:panel>
     
     
    		</h:form>
    Le Backing 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
    @ManagedBean
    @ViewScoped
    public class GestionAbsenceBean implements Serializable {
        private static final long serialVersionUID = 1L;
        private Absence           absence;
        private List<Absence>     absences;
     
        // Injection de notre EJB (Session Bean Stateless)
        @EJB
        private AbsenceDao        absenceDao;
     
        @PostConstruct
        public void init() {
            lister();
        }
     
        // Initialisation de l'entité utilisateur
        public GestionAbsenceBean() {
            absence = new Absence();
        }
     
        // Méthode d'action appelée lors du clic sur le bouton duformulaire
        // d'inscription
        public void creation() {
            absenceDao.creer( absence );
            FacesMessage message = new FacesMessage( "Succès de la création !", absence.getId().toString() + " "
                    + absence.getCause() );
            FacesContext.getCurrentInstance().addMessage( null, message
                    );
            lister();
        }
    ...
    La classe DAO :

    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
    @Stateless
    public class AbsenceDao {
        private static final String JPQL_SELECT_PAR_ID  = "SELECT a FROM Absence a WHERE a.id=:id";
        private static final String JPQL_SELECT_PAR_NOM = "SELECT a FROM Absence a WHERE a.nom=:nom";
        private static final String JPQL_SELECT_ALL     = "SELECT a FROM Absence a ORDER BY a.cause ASC";
        private static final String PARAM_ID            = "id";
        private static final String PARAM_NOM           = "nom";
     
        // Injection du manager, qui s'occupe de la connexion avec la BDD
        @PersistenceContext( unitName = "bdd_sgg_PU" )
        private EntityManager       em;
     
        public void creer( Absence absence ) throws DAOException
        {
            try {
                em.persist( absence );
     
            } catch ( Exception e ) {
                throw new DAOException( e );
            }
        }
     
    ...
    L'entité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Entity
    @SequenceGenerator( name = "AbsSeq", sequenceName = "ABSENCE_SEQ", allocationSize = 1 )
    public class Absence {
     
        @Id
        @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "AbsSeq" )
        private Integer id;
     
    ...
    La séquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE SEQUENCE  "CEDRIC"."ABSENCE_SEQ"  MINVALUE 1 MAXVALUE 1,00000000000000E+27 INCREMENT BY 1 START WITH 64 NOCACHE  NOORDER  CYCLE ;
    Tech : JPA (Eclipselink), JSF (dont Primefaces), Oracle, Glassfish 4

  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
    Dans ta page, ton el #{gestionAbsenceBean.absence} pointe sur une variable qui n'est initalisée qu'au posconstruct de ton managed bean.
    La première fois que tu appelle ta méthode creation(), ton objet "absence" est persistée en base de données, sa référence est donc mise à jour dans ton backing bean. Si tu rappelles ta méthode creation(), tu persistes la même entité.
    A la fin de ta méthode creation(), réinitialise ta variable absence, cela devrait aller mieux.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    C'est exactement ca !!! Merci énormément. Comme quoi une ligne de code manquante peut être vraiment embêtante ..

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

Discussions similaires

  1. [AJAX] Recharger un menu deroulant php sans recharger la page
    Par ns_deux dans le forum Général JavaScript
    Réponses: 25
    Dernier message: 22/07/2006, 15h59
  2. Atteindre une ancre sans recharger la page
    Par maxxou dans le forum Langage
    Réponses: 2
    Dernier message: 22/07/2006, 14h06
  3. [PHP-JS] Envoi de fichier sans recharger la page
    Par goldorax113 dans le forum Langage
    Réponses: 8
    Dernier message: 30/05/2006, 17h43
  4. [C#][JS] Sur clic : message sans recharger la page
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 8
    Dernier message: 24/01/2006, 17h20
  5. Changer la police avec un select, sans recharger la page
    Par Netoman dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/12/2004, 18h07

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