1

Google クラウド SQL で JPA を使用して、このロール オブジェクトを永続化しようとしています。しかし、主キー違反の例外をキャッチして適切なメッセージをユーザーに表示する方法がわかりません。

コードのこの部分の try と catch の書式設定に助けが必要です

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

}

前もって感謝します 。

4

1 に答える 1

4

JPAを使用しているため、スローされます

org.eclipse.persistence.exceptions

しかし、 SQL Exceptionをキャッチすると仮定すると、そこから 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:27:13.983 に答える