2013-05-27 64 views
1

我想在Google云SQL中使用JPA持久化这个角色对象。但我不知道如何捕捉主键违例异常并向用户显示相应的消息。java.sql.SQLException:重复键'sd'键'PRIMARY'

需要帮助格式化try和catch代码

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

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

这是我整个的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

由于您使用JPA它会抛出你

org.eclipse.persistence.exceptions

但你想赶上SQL异常,并从,你可以得到次SQL状态

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

希望这个作品:)

相关问题