你好,我是 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/