当前位置: 首页 > 知识库问答 >
问题:

使用JPA 2.1时未看到持久性错误详细信息

那鹏
2023-03-14

我已经强制发送高于表列中允许的最大值的字符串的错误,在DB中执行persist时的跟踪显示给我一个通用错误,而我还没有设法知道生成的确切错误。我试图在没有得到类似SQLExeception的跟踪的情况下获取原因。

费用:

  • JPA 2.1+WL12.2.1+Oracle DB XE 11g。
  • 我知道在执行persist之前可以验证长度的内容。
  • 使用SP显示的错误跟踪是我所期望的(SQLException)。

代码

package pe.com.claro.demo.alumno.domain.service;

import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.sql.SQLException;

import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ObjectMapper;

import pe.com.claro.common.property.Constantes;
import pe.com.claro.common.resource.util.HeaderRequestBean;
import pe.com.claro.demo.alumno.domain.repository.AlumnoRepository;
import pe.com.claro.demo.alumno.domain.util.AlumnoModel;
import pe.com.claro.demo.alumno.domain.util.DistritoModel;
import pe.com.claro.demo.alumno.message.request.InsertarAlumnoRequest;
import pe.com.claro.demo.alumno.message.response.InsertarAlumnoResponse;
import pe.com.claro.demo.alumno.persistencia.entity.Alumno;
import pe.com.claro.demo.alumno.persistencia.entity.Distrito;

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class AlumnoService implements Serializable {

    private static final long serialVersionUID = 1L;

    private static final Logger LOG = LoggerFactory.getLogger(AlumnoService.class);

    @EJB
    private AlumnoRepository alumnoRepository;

    @Resource
    private EJBContext context;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public InsertarAlumnoResponse insertarAlumno(InsertarAlumnoRequest request, HeaderRequestBean headerRequest) {

        InsertarAlumnoResponse response = new InsertarAlumnoResponse();
        UserTransaction utx = context.getUserTransaction();

        try {
            LOG.info("Insertar alumno mediante JPA:");

            utx.begin();

            LOG.info("[Actividad 1 - Registrar Venta]");

            Distrito distrito = DistritoModel.setDatosDistrito(request);
            Alumno alumno = AlumnoModel.setDatosAlumno(request, distrito);

            String requestPrintHeader = new ObjectMapper().writerWithDefaultPrettyPrinter()
                    .writeValueAsString(headerRequest);
            LOG.info("Datos de Entrada Header:\n {}", requestPrintHeader);
            String requestPrintBody = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(alumno);
            LOG.info("Datos de Entrada Body: \n {}", requestPrintBody);

            alumnoRepository.persist(alumno);

            utx.commit();
            LOG.info("Registro realizado con exito.");

            response.setMensajeError(Constantes.MENSAJEOK);
            response.setCodigoRespuesta(Constantes.INSERTAR_ALUMNO_CODIGO_IDF0);
            response.setMensajeRespuesta(Constantes.INSERTAR_ALUMNO_MENSAJE_IDF0);

        } catch (Exception ex) {
            **LOG.info("Ocurrio un error de BD: \n {}", ex.getMessage(), ex);**

            if(utx != null){
                try {
                    LOG.info("[Actividad 2 - Rollback]");
                    utx.rollback();
                    LOG.info("Rollback finalizado con exito");

                } catch (IllegalStateException | SecurityException | SystemException e) {
                    LOG.info("Error realizando Rollback: \n {}", e.getMessage(), e);
                    response.setMensajeError(e.getMessage());
                    response.setCodigoRespuesta(Constantes.INSERTAR_ALUMNO_CODIGO_IDT3);
                    response.setMensajeRespuesta(Constantes.INSERTAR_ALUMNO_MENSAJE_IDT3);
                }
            }
            if (ex.getCause() != null && ex.getCause().toString().indexOf(Constantes.CONSTANTE_NO_JNDI) != -1) {
                response.setMensajeError(ex.getMessage());
                response.setCodigoRespuesta(Constantes.INSERTAR_ALUMNO_MENSAJE_IDT2);
                response.setMensajeRespuesta(Constantes.INSERTAR_ALUMNO_MENSAJE_IDT2);

            } else {
                response.setMensajeError(ex.getMessage());
                response.setCodigoRespuesta(Constantes.INSERTAR_ALUMNO_CODIGO_IDT3);
                response.setMensajeRespuesta(Constantes.INSERTAR_ALUMNO_MENSAJE_IDT3);
            }
        }

        return response;
    }

}

共有1个答案

张淳
2023-03-14

将JPA实现上的日志级别更改为trace/finest以从处理中获取更多信息还不够吗?

还是为了调试目的在Oracle jdbc驱动程序上设置跟踪?(下载具有调试功能的驱动程序,如OJDBC6_G.jar,使用-doracle.jdbc.TRACE=true,并将日志记录类别“oracle.jdbc.driver”设置为TRACE)https://docs.oracle.com/cd/b28359_01/java.111/b31224/diagnose.htm

 类似资料:
  • 问题内容: 我收到以下错误: 这是我的persistence.xml文件: 这是我的persistenceLayer.xml: persistence.xml位于src / META-INF中,该文件位于构建路径中,因此应正确找到它。谁有想法? 问题答案: 好吧,我通常将persistence.xml放在资源文件夹/src/main/resouces/META- INF/persistence.x

  • “复制详细信息”页面显示你在受监控的复制页面中选择的从服务器或订阅服务器的详细复制信息。 复制详细信息页面的信息 摘要 本页面的开始部分列出了从服务器和主服务器信息。对于 MySQL 或 MariaDB 多源复制,你可以点击主服务器名来查看其复制详细信息。 复制启动关闭图表 它显示复制的启动或关闭状态图表或成功失败状态图表。时间选择器用于选择图表内显示的时间跨度和间隔(X 轴)。它包含日期时间选取

  • 在概览页面中,点击一个实例卡片以打开其“实例详细信息”页面。它以可视方式显示服务器参数和指标,让你快速查看服务器负载和性能。你可以使用“暂停监控”和“继续监控”按钮来暂停和继续监控实例。Navicat Monitor 会停止从服务器收集信息,直到监控继续。 所有受监控的实例都显示在左侧窗格中。选择一个实例以查看与其相关的信息。 实例详细信息页面的信息 摘要 它显示有关服务器的主机信息、服务器属性、

  • 我已经更新到AndroidStudio 3.1,它在编译时没有显示错误的详细信息。假设我在某个地方漏掉了一个分号,或者我没有实现一个接口的方法,那么它总是给我这个错误,但没有告诉我错误发生的原因和地点!所有错误详细信息都在Studio 3.0中完美显示。如何在3.1中看到它们? 这是我每次出错时收到的消息。

  • 当向我的Maven-Java-project添加持久性时,我可以成功地构建和编译(Netbeans中的“清理和构建项目”,我假设它确实mvn站点)项目,但是我将无法在之后启动它(Netbeans中的“运行项目”)。 我已经尝试了一段时间而没有成功。例如,我试图删除pom中的组织.codehaus.mojo插件.xml尽管我的成功没有变化。 有人知道这个问题吗?我对MySQL数据库的设置有没有配置错

  • 我只是在学习android studio,得到这个错误,无法解决。我甚至搞不清楚这个问题与什么有关。(所有其他应用程序都正常工作)。我尝试了stackoverflow中的一些其他解决方案,但没有一个解决我的问题.... 有什么解释吗???