Bonjour,

je travail avec JPA/Hibernate, mon problème est que je n'arrive pas à catch l'exception org.hibernate.exception.ConstraintViolationException et à afficher l'erreur, soit dans la console soit avec un JOptionPane.

Je voudrai que ce message s'affiche à cause d'une contrainte d'unicité sur ma colonne nom de catégorie.
Ma contrainte fonctionne correctement et le rollback fonctionne également, mais impossible d'afficher un message dans la console ou une fenêtre pop-up d'erreur.

Mon test unitaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
@Test
    public void test1_insert_categorie(){
        Controler contr = Controler.getInstance();
        contr.addCategorie("Boisson");
        System.out.println("TEST1 - Catégorie ajouté dans la DB.");        
    }
Mon controler
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
88
89
90
91
92
93
94
95
96
97
98
public class Controler {
 
    /**
     * attributs
     */
    public HashSet<CategorieArticle> listeCategorie;
    //public ArrayList<Commande> listCommandes;
    //public ArrayList<Commande> listCommandesCloturee;
    //public ArrayList<Commande> listCommandesAnnulee;
    //public ArrayList<Client> listClients;
    //public ArrayList<Article> listArticles;
    //private TabUpdateClient tabClient;
    private static final Controler INSTANCE = new Controler();
    //public Commande loadCommandeById;
    //public PageAccueil pageAccueil;
 
    // création écouteur pour le rafraîchissement des vues (observer)
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
 
    /**
     * Constructeur
     */
    private Controler() {
        //this.pageAccueil = new PageAccueil(this);
        //pageAccueil.setVisible(true);
    }
 
    /**
     * getInstance, retourne une instance unique de mon controleur
     *
     * @return INSTANCE
     */
    public static Controler getInstance() {
        return INSTANCE;
    }
 
    /**
     * getteur d'une liste de categorie retourne une liste de categorie
     *
     * @return HashSet listeCategorie
     */
    public HashSet getListeCategories() {
        return listeCategorie;
    }
 
    /**
     * setteur d'une liste de categorie
     *
     * @param emptySet
     */
    public void setListeCategories(HashSet emptySet) {
 
    }
 
    /**
     * Ajout d'une catégorie d'article
     *
     * @param nom
     */
    public void addCategorie(String nom){
        CategorieArticle cat = new CategorieArticle(nom);
        IntDAO createCat = DAOFactory.getDAO("CategorieArticleDAO");
        createCat.create(cat);
    }
 
    /**
     * Lecture d'une catégorie d'article sur base de l'id
     *
     * @param id
     * @return cat
     */
    public CategorieArticle loadCategorieById(int id) {
        CategorieArticle cat = new CategorieArticle(id);
        IntDAO createCat = DAOFactory.getDAO("CategorieArticleDAO");
        cat = (CategorieArticle) createCat.read(id);
        return cat;
    }
 
    /**
     * Delete d'une catégorie d'article sur base de l'id
     *
     * @param id
     */
    public void delCategorie(int id) {
        IntDAO createCat = DAOFactory.getDAO("CategorieArticleDAO");
        createCat.delete(id);
    }
 
    /**
     * Update d'une catégorie d'article sur base de l'id
     *
     * @param id
     * @param nom
     */
    public void updateCategorie(int id, String nom) {
        IntDAO createCat = DAOFactory.getDAO("CategorieArticleDAO");
        createCat.update(id, nom);
    }}
Ma classe CategorieArticleDAO
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
public class CategorieArticleDAO implements IntDAO {
 
    public CategorieArticleDAO() {
    }
 
    /**
     * Create pour faire l'insert d'une nouvelle catégorie via un requête Hibernate
     * @param entity 
     */
    @Override
    public void create(Object entity) {
        CategorieArticle cat = (CategorieArticle) entity;
        EntityManager em = JPAUtility.getEM();
        em.getTransaction().begin();
        try{
            em.persist(cat);
            em.getTransaction().commit();
        }catch(ConstraintViolationException ex) {
            em.getTransaction().rollback();
            System.out.println("Objet déjà existant");
            JOptionPane.showMessageDialog(null, ex, "Objet déjà existant", JOptionPane.ERROR_MESSAGE);
            Logger.getLogger(CategorieArticleDAO.class.getName()).log(Level.SEVERE, null, ex.getMessage()); 
        }finally{
            em.close();
            JPAUtility.closeEMF();
        }
    }}