java - hibernate 无故插入

标签 java sql spring hibernate model-view-controller

你好,我是 JAVA hibernate 和 spring 的新手,我有一个问题,如果你能帮助我,我将不胜感激。 我会向你解释。

  • 我有一个应用程序,它有一个收件箱,所有来自 列出了当前用户。
  • 然后我有一个表单可以在数据库中插入新消息,它 没问题。
  • 发送该表单并创建新消息后, Controller 使您返回到索引页面,其中再次列出了所有消息。 但是当你刷新页面时,hibernate 会再次插入到 数据库,无需发送另一个“新消息”表格,只需 当我刷新索引页时另一个插入...

我想这可能是因为 hibernate 没有正确地关闭与数据库的连接,我不知道.. 我将在下面向您展示我使用的功能:

我在委托(delegate)中使用函数 "enviarMensaje()",它调用以下函数:


enviarMensaje()(将消息对象保存到数据库中)
guardarMensajesDestinatario()(保存 几个接收者对象到数据库中)

这是因为一条消息有很多接收者,所以我有两个表。

代码如下:

委托(delegate)功能

public String enviarMensaje(String[] mensajesDestinatariosStr, MenMensajes mensaje) {

    boolean respuesta=false;
    String strRespuesta = "error al enviar el mensaje";
    ArrayList<MenMensajesDestinatarios> destinatariosList=null;
    //MenMensajesDestinatarios md=null;
    try{
        respuesta=mensajesDAO.enviarMensaje(mensaje);

        for(String destinatarioStr : mensajesDestinatariosStr){
            MenMensajesDestinatarios md=new MenMensajesDestinatarios();
            System.out.println(destinatarioStr);
            BigDecimal usuarioIdNumber=new BigDecimal(Integer.parseInt(destinatarioStr));
            md.setUsuarioId(usuarioIdNumber);
            md.setFechaCreacion(mensaje.getFechaCreacion());
            md.setModificadoPor(mensaje.getModificadoPor());
            md.setCreadoPor(usuarioIdNumber);
            md.setMenMensajes(mensaje);
            md.setEstado(mensaje.getEstado());
            mensajesDAO.guardarMensajesDestinatario(md);

        }


        if (respuesta) {
            strRespuesta = "El mensaje ha sido eviado con exito";
        }
    }catch(Exception e){
        e.printStackTrace();
        e.getMessage();
    }


    return strRespuesta;
}

DAO 函数

 public boolean enviarMensaje(MenMensajes mensaje){
    Session session = null;
    boolean exito=false;
    Transaction trx=null;
    try{
        session = sessionFactoryHestia.openSession();
        trx=session.beginTransaction();
        session.saveOrUpdate(mensaje);
        trx.commit();
        session.flush();
        exito=true;
    }catch(Exception e){
        System.out.println("Error guardando datos");
        e.printStackTrace();
        trx.rollback();
        session.close();
    }
    return exito;
}


public void guardarMensajesDestinatario(MenMensajesDestinatarios md) {
    Session session=null;
    Transaction trx=null;
    try{
        session = sessionFactoryHestia.openSession();
        trx=session.beginTransaction();
        session.saveOrUpdate(md);
        trx.commit();
        session.flush();

    }catch(Exception e){
         e.printStackTrace();
         e.getMessage();
    }finally{
        session.close();
    }
}

以防万一控制者

  @RequestMapping(value = "enviarMensaje.htm")
public String enviarMensaje(HttpSession session, @Valid @ModelAttribute("menMensaje") MenMensajes mensaje,
        BindingResult result, ModelMap modelMap, HttpServletRequest request) {
    Integer intOpcion = 1;
    AppUsuarios user = (AppUsuarios) session.getAttribute("usuarioVO");//usuario de la sesion
    BigDecimal usuarioId = user.getUsuarioId();//guardar el id del usuario de la sesion para pasarlo como parametro
    String[] mensajesDestinatarios = request.getParameterValues("destinatarios");

    try {

       String respuesta = mensajesDelegate.enviarMensaje(mensajesDestinatarios, mensaje);

        modelMap.addAttribute("mensajes", mensajesDelegate.listarMensajesTodos(usuarioId, intOpcion));
        modelMap.addAttribute("opcion", intOpcion);
        modelMap.addAttribute("menMensaje", mensajesDelegate.cargarMensaje(usuarioId, null)); //pasarle un objeto MenMensajes al formulario de nuevo mensaje que esta oculto en un modal.
        modelMap.addAttribute("cboUsuarios", mensajesDelegate.cargarUsuarios()); //pasarle la lista de usuarios de la BD para combo de nuevo mensaje
        modelMap.addAttribute("cboTiposMensaje", mensajesDelegate.cargarTiposMensaje()); //pasarle la lista de tipos de mensaje de la BD para el combo de nuevo mensaje
    } catch (Exception e) {
        System.out.println("Error en nuevoMensaje.htm");
    }
    return "/mensajes/index";
}

最佳答案

刷新页面时,您实际上是在再次提交表单,这就是您多次插入的原因,将保存方法的返回更改为:

return "redirect:"+url;

代替:

return "/mensajes/index";

其中 url 是 Controller 中的映射 url。

关于java - hibernate 无故插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755528/

相关文章:

java - android 添加按钮到标题栏

mysql - SQL - 如果 id 的所有 bool 值都为真则更新

java - 忽略嵌套响应类的根 json 键

java - Spring Boot EntityManagerFactoryBuilder 未 Autowiring

java - Spring 端点为较大的 http 请求接收截断的正文

c# - monodroid中Task的实现

java - 动态添加按钮到 fingerpaint android api 演示

sql - 计算sqlite中的方差

mysql - 在 MySQL 中插入特定行的列并合并行

java - 如何实现Java可比接口(interface)?