2013-05-27 4 views
1

Google 클라우드 SQL에서 JPA를 사용하여이 역할 객체를 유지하려고합니다. 하지만 기본 키 위반 예외를 잡아 내고 사용자에게 적절한 메시지를 표시하는 방법을 모르겠습니다.java.sql.SQLException : 'PRIMARY'키에 중복 항목 'sd'가 있습니다.

코드

EntityManager em = EMF.get().createEntityManager(); 
EntityTransaction tx = em.getTransaction(); 

      tx.begin(); 
      em.persist(r); 
      tx.commit(); 

이 내 전체 서블릿 코드의이 부분에 형식화하는의 시도 및 캐치의 도움이 필요합니다.

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

} 

미리 감사드립니다. 당신은 JPA를 사용하고 있기 때문에

답변

4

그것은 당신에게

org.eclipse.persistence.exceptions

가 발생합니다하지만 당신은 SQL 예외을 잡으려고 생각하고 그에서 것은 당신이 일을 얻을 수 있습니다 SQL 상태

SQLSTATE 23000 ==> 무결성 제약 조건 위반

내부 예외 예의 Rupesh Kumar Kushwaha 블로그를

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

희망에 액세스 할 수

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 
} 

방법 아래와 같이

시도가 구현하는이 작품 :)