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:
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:
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:
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:
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:
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