3

由于违反主键约束,我收到此错误我的问题是如何捕获所有这些异常。

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] 

这是我的 servlet 代码:

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");
    }

}
4

1 回答 1

3

由于您使用的是 JPA,它会抛出你

org.eclipse.persistence.exceptions

但是你应该捕捉到SQL 异常,然后你可以得到 SQL STATE

SQLSTATE 23000 ==> 违反完整性约束

尝试执行如下所示

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
}

访问内部异常的方法由Rupesh Kumar Kushwaha博客提供

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

希望这有效:)

于 2013-05-29T06:38:16.397 回答