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