2013-05-28 56 views
2

我得到這個錯誤,因爲主鍵約束違反我的問題是怎麼可以我抓住了所有這些例外。錯誤:異常[EclipseLink-4002](Eclipse持久性服務 - 2.4.1.v20121003-ad44345):org.eclipse.persistence.exceptions.DatabaseException

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([email protected]) 
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"); 
    } 

} 
+1

數據庫操作直接在servlet中,糟糕的設計和缺乏的處理機制。請參閱文檔 - http://docs.oracle.com/javase/tutorial/essential/exceptions/ –

+0

我該如何避免異常處理機制?我的意思是,它應該拋出異常,我應該處理所有這些。但問題是我不知道哪個例外,怎麼樣? –

+0

您可以嘗試在日誌中找到它,它是'DatabaseException'中包裝的'SQLException',可以抓住後者。你有沒有試過通過提供的鏈接,會幫助你更好地理解。 –

回答

2

由於您使用JPA它會拋出你

org.eclipse.persistence.exceptions

但你想趕上SQL異常,並從該你可以得到SQL狀態

SQLSTATE 23000 ==> Integrity constraint violation

試圖實現如下圖所示

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

希望這個作品:)