Error:Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException

27,744

Since you are using JPA it will throw you

org.eclipse.persistence.exceptions

But you are suppose to catch SQL Exception and from that you can get th SQL STATE

SQLSTATE 23000 ==> Integrity constraint violation

try to implement as shown below

EntityManager em = EMF.get().createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
   tx.begin();
   em.persist(r);
   tx.commit();
} catch (PersistenceException ex) {
Throwable t = getLastThrowable(ex);  //fetching Internal Exception
SQLException exxx = (SQLException) t;  //casting Throwable object to SQL Exception
System.out.println(exxx.getSQLState());
if(exxx.getSQLState()==23000) // Integrity constraint violation
{
 //Custom Bussiness Logic
}

Method to access Internal Exception courtesy Rupesh Kumar Kushwaha Blog

private Throwable getLastThrowable(Exception e) {
Throwable t = null;
for(t = e.getCause(); t.getCause() != null; t = t.getCause());
return t;
} 

Hope This Works :)

Share:
27,744
Deepesh Shetty
Author by

Deepesh Shetty

Updated on May 29, 2020

Comments

  • Deepesh Shetty
    Deepesh Shetty almost 4 years

    I am getting this error because of primary key constraint violation my question is how can i catch all these exceptions .

    HTTP ERROR 500
    
    Problem accessing /persist_role_servlet. Reason:
    
    Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
    Internal Exception: java.sql.SQLException: Duplicate entry 'sd' for key 'PRIMARY'
    Error Code: 1062
    Call: INSERT INTO ROLE (ROLE_ID, ROLE_DESC, ROLE_NAME) VALUES (?, ?, ?)
        bind => [3 parameters bound]
    Query: InsertObjectQuery(com.example.rolessample.role@3f1179)
    Caused by:
    
    javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
    Internal Exception: java.sql.SQLException: Duplicate entry 'sd' for key 'PRIMARY'
    Error Code: 1062
    Call: INSERT INTO ROLE (ROLE_ID, ROLE_DESC, ROLE_NAME) VALUES (?, ?, ?)
        bind => [3 parameters bound] 
    

    This my servlets code:

    package com.example.rolessample;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityTransaction;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class persist_role_servlet extends HttpServlet {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
    
            PrintWriter out = resp.getWriter();
    
            String role_id = req.getParameter("role_id");
            String role_name = req.getParameter("role_name");
            String role_desc = req.getParameter("role_desc");
    
            String comp_id = "";
            String parent_comp = "";
            String permission = "";
    
            role r = new role();
    
            r.setRole_id(role_id);
            r.setRole_name(role_name);
            r.setRole_desc(role_desc);
    
    
            //Persisting the role bean .
    
            EntityManager em = EMF.get().createEntityManager();
            EntityTransaction tx = em.getTransaction();
    
                tx.begin();
                em.persist(r);
                tx.commit();
    
    
    
    
            String[] checkboxNamesList = req.getParameterValues("component");
    
            for (int i = 0; i < checkboxNamesList.length; i++) {
    
                String[] myCheckBoxValue = req
                        .getParameterValues(checkboxNamesList[i]);
    
                //If null, it means checkbox is not in request, so unchecked
                if (myCheckBoxValue == null) {
    
                    component comp = new component();
    
    
                    //Logic for finding component's name,component parent and their permissions.
                    String S1 = checkboxNamesList[i];
                    int lastUnderscore = S1.lastIndexOf("_");
                    permission = S1.substring(lastUnderscore + 1);
                    comp_id = S1.substring(0, lastUnderscore);
                    lastUnderscore = comp_id.lastIndexOf("_");
                    parent_comp = comp_id.substring(0, lastUnderscore);
    
    
    
                    comp.setComp_id(comp_id);
                    comp.setParent_comp(parent_comp);
                    comp.setRole_id(role_id);
                    comp.setPermission(permission);
    
                    //Persisting component bean .
    
    
                        tx.begin();
                        em.persist(comp);
                        tx.commit();
    
                }
                // if is there, it means checkbox checked
                else {
                    out.println(checkboxNamesList[i] + "=checked");
    
                }
    
            }
    
            // resp.setHeader("Refresh", "0; url=/guestbook.jsp");
        }
    
    }