我正在尝试在Google云端SQL中使用JPA来保留此角色对象。但我不知道如何捕获主键违规异常并向用户显示相应的消息。
需要帮助格式化尝试并捕获代码的这一部分
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");
}
}
提前致谢。
答案 0 :(得分:4)
由于你使用的是JPA,它会抛弃你
org.eclipse.persistence.exceptions
但是你想要捕获 SQL异常,并且你可以从中获得SQL状态
SQLSTATE 23000 ==&gt;完整性约束违规
尝试实现如下所示
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;
}
希望这项工作:)