Bonjour,
Je suis confronté à un problème que je n'ai jamais observé auparavant. Une fois sur deux le même code échoue ! Voici mon problème.
J'enregistre un circuit. Ce circuit(cir) appartient à un centre (cei). Ce centre appartient à un district.
Voici le code de la fonction doExecute de ma classe EnregistrerCeiAction héritant de ActionForm :
Au premier essai l'enregistrement ne fonctionne pas et me retourne une erreur :
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 public ActionForward doExecute(ActionMapping mapping, AbstractActionForm form, HttpServletRequest request, HttpSession session, HttpServletResponse response, String idContexte, String sousAction) throws TechniqueException, RegleGestionException { Cir unCir = new Cir(); CirForm cirForm = (CirForm) form; ServiceFactory serviceFactory = ServiceFactory.getInstance(); ICirService cirService = serviceFactory.getCirService(); ICeiService ceiService = serviceFactory.getCeiService(); Cei unCei = (Cei)ceiService.rechercherParId(cirForm.getCei(),idContexte); if (cirForm.getId() == 0) { cirService.creer(unCir, idContexte); } else { unCir = (Cir)cirService.rechercherParId(cirForm.getId(),idContexte); } unCir.setLibelle(cirForm.getLibelle()); unCir.setActif(false); unCir.setId(cirForm.getId()); unCir.setCei(unCei); //TODO VALIDER le libelle cirService.save(unCir, idContexte); request.setAttribute(Constantes.CIR_FORM, unCir); return mapping.findForward("succes"); }
Bon déjà, je ne lui ai jamais demandé de modifier le centre... Mais là n'est pas le plus surprenant. Je remarque que la séquence sur la table circuit s'est incrémenté, il a donc bien enregistré le circuit avec l'id 10. Après il fait cet update et j'en ignore la raison... Comme il y a une erreur (dis_id ne peut être null) il ne valide pas la transaction (aucun commit).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Caused by: java.sql.BatchUpdateException: L'élément du batch 0 update te_cei_cei set cei_lib=CEI Champigneulles, cei_nature=VRU , dis_id=NULL, zon_id=3 where cei_id=9 a été annulé. Appeler getNextException pour en connaître la cause. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2392) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1257) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:334) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2451) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
Et là j'actualise la page et tout s'enregistre correctement avec un circuit ayant comme id 11.
J'actualise à nouveau, j'obtiens l'erreur. Le circuit id 12 n'est pas créé.
J'actualise à nouveau, tout marche, le circuit id 13 est créé, etc..., etc...
J'ai essayé de contrôler le cei avant le mon test if en ajoutant cette ligne de code :
L'erreur de gestion n'est jamais levée. Le soucis vient donc de quelquechose que je ne comprends vraiment pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if (unCei.getDis() == null || unCei.getDis().getId() == 0){ throw new RegleGestionException("District vide !"); }
Une idée de l'origine du problème ?
Partager