Hibernate - Não Comita

14 respostas
vinicius_roc

Quando eu vou criar um usuario com o hibernate, aparente ele cria sem problema, pois não erro no comando save, mas quando ele faz transaction.commit ele retorna um erro dizendo que nome não pode ser nulo, mas quando eu faço debug realmente esta tudo preenchido com excessão do id.

O que pode estar acontecendo e como resolvo??

Algo com mapeamento dos Modelos???

Obrigado a todos

14 Respostas

rchgonzaga

vinicius_roc:
Quando eu vou criar um usuario com o hibernate, aparente ele cria sem problema, pois não erro no comando save, mas quando ele faz transaction.commit ele retorna um erro dizendo que nome não pode ser nulo, mas quando eu faço debug realmente esta tudo preenchido com excessão do id.

O que pode estar acontecendo e como resolvo??

Algo com mapeamento dos Modelos???

Obrigado a todos

Fala vinicius,

posta o stack ai pra gente ver.

Abraço

G

Depois do comando save, coloque o comando session.flush() depois commit.

vinicius_roc
Fala vinicius,

posta o stack ai pra gente ver.

Abraç

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
	org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	MZSuporte.dao.DaoFactory.commit(DaoFactory.java:22)
	action.NUserAction.execute(NUserAction.java:53)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.sql.BatchUpdateException: Column 'nome' cannot be null
	com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1693)
	com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	MZSuporte.dao.DaoFactory.commit(DaoFactory.java:22)
	action.NUserAction.execute(NUserAction.java:53)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.
rchgonzaga
vinicius_roc:
Fala vinicius,

posta o stack ai pra gente ver.

Abraç

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
	org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	MZSuporte.dao.DaoFactory.commit(DaoFactory.java:22)
	action.NUserAction.execute(NUserAction.java:53)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.sql.BatchUpdateException: Column 'nome' cannot be null
	com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1693)
	com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	MZSuporte.dao.DaoFactory.commit(DaoFactory.java:22)
	action.NUserAction.execute(NUserAction.java:53)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.

é Sistema web neh ??? ta usando o OpenSessionInView???

Ta fazendo oque o Guedes falou ali em cima ??

ATt

rchgonzaga

Cara … olhei meio meio sem atencao o stack

agora que vi

Column ‘nome’ cannot be null

da uma olhada nisso

faz um teste unitario ai … insere somente um … mais via codigo mesmo!! veja se passa …

vinicius_roc

Então...

è isso que não estou entendendo.

Por que eu fiz um debug e vi que na hora do save esta tudo preenchido, com excessão do id que o banco gera sozinho.

Vou postar todos os codigos que fazem parte do processo:

vamos lah?

1º pagina de cadastro

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html:html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>MZ TI - Suporte</title>
    </head>
    <body>
        <h1 align="center">Novo Usuario</h1>
        <html:form action="altUser.do" focus="user.nome">
            <table border="0">
                <tr>
                    <td><b>Nome: </b></td>
                    <td><html:text value="${user.nome}" property="user.nome" size="32"/></td>
                </tr>
                <tr>
                    <td><b>Area: </b></td>
                    <td><html:select property="idarea" >
                        <html:options collection="narea" property="id" labelProperty="nome" />
                    </html:select></td>
                </tr>
                <tr>
                    <td><b>Ramal: </b></td>
                    <td><html:text size="3" value="${user.ramal}" property="user.ramal"/><html:errors property=""/></td>
                </tr>
                <tr>
                    <td><b>Baia: </b></td>
                    <td><html:text size="2" value="${user.baia}" property="user.baia"/></td>
                </tr>
            </table>
            <html:hidden value="${createuser.acao}" property="acao"/>
            <html:hidden value="${user.id}" property="user.id"/>
            <html:submit value="Cadastrar" property="btenviar"/>
        </html:form>
        <p>
            <font size="-2" color="red">
                <b><html:errors/></b>
            </font>
        </p>
    </body>
</html:html>

2º Formulario

package form;

import MZSuporte.dao.DaoFactory;
import MZSuporte.model.Area;
import MZSuporte.model.Usuarios;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.*;

public class NewUserForm extends ActionForm {

    private Usuarios user = new Usuarios();
    private String idarea;
    private String btenviar;
    private String acao;

    public String getIdarea() {
        return idarea;
    }

    public void setIdarea(String idarea) {
        this.idarea = idarea;
    }

    public void setUser(Usuarios user) {
        this.user = user;
    }

    public Usuarios getUser() {        
        Area a = new Area();
        a.setId(this.idarea);
        this.user.setArea(a);
        return user;
    }

    public String getAcao() {
        return acao;
    }

    public void setAcao(String acao) {
        this.acao = acao;
    }

    public String getBtenviar() {
        return btenviar;
    }

    public void setBtenviar(String btenviar) {
        if (btenviar.equals("Alterar")) {
            this.acao = btenviar;
        }
        if (btenviar.equals("Excluir")) {
            this.acao = btenviar;
        }
        this.btenviar = btenviar;
    }

    @Override
    public ActionErrors validate(ActionMapping action, HttpServletRequest request) {

        ActionErrors erros = new ActionErrors();

        if (this.btenviar.equals("Alterar") || this.btenviar.equals("Excluir")) {
            try{            
            DaoFactory dao = new DaoFactory();
            this.user = dao.getUsuariosDAO().read(this.user.getId());
            } catch (SQLException e){
                System.out.println(e.getMessage());
            }

        } else {
            if (this.user.getNome() == null || this.user.getNome().equals("")) {
                erros.add("nome", new ActionMessage("erro.campoNome"));
            }
            if (this.user.getRamal() != null || this.user.getRamal().equals("")) {
                if (!isNumber(user.getRamal())) {
                    erros.add("ramal", new ActionMessage("erro.campoRamal"));
                }
            }

            if (this.user.getBaia() != null || user.getBaia().equals("")) {
                if (!isNumber(user.getBaia())) {
                    erros.add("baia", new ActionMessage("erro.campoBaia"));
                }
            }
        }

        return erros;
    }

    public Boolean isNumber(String id) {
        try {
            int n = Integer.parseInt(id);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

3º: Action

package action;

import form.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import MZSuporte.dao.*;
import MZSuporte.model.*;

public class NUserAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

        NewUserForm userform = (NewUserForm) form;
        Usuarios user = userform.getUser();
        HttpSession session = request.getSession();
        ActionMessages erro = new ActionMessages();
        BaiaDAO bdao = new BaiaDAO();
        DaoFactory dao = new DaoFactory();
        int i = 0;

        if (!dao.getUsuariosDAO().existsRamal(user.getRamal())) {
            erro.add("create.erro", new ActionMessage("Ramal inexistente!", false));
            i++;
        }

        if (!bdao.exists(user.getBaia())) {
            erro.add("create.erro", new ActionMessage("Baia inexistente!", false));
            i++;
        }

        if (i == 0) {
            request.setAttribute("createuser", userform);
            if (userform.getBtenviar().equals("Alterar")) {
                Usuarios u = dao.getUsuariosDAO().read(user.getId());
                session.setAttribute("user", u);
                return mapping.findForward("altuser");
            } else if (userform.getBtenviar().equals("Excluir")) {                
                Usuarios u = dao.getUsuariosDAO().read(user.getId());
                request.setAttribute("user", user);
                String acao = "excluido";
                request.setAttribute("acao", acao);
                return mapping.findForward("okuser");
            } else {                
                String acao = null;
                if (userform.getAcao().equals("Alterar")) {
                    dao.getUsuariosDAO().update(user);
                    acao = "alterado";
                    request.setAttribute("acao", acao);
                } else {                    
                    dao.beginTransaction();
                    dao.getUsuariosDAO().create(user);
                    dao.commit();
                    dao.close();
                    acao = "cadastrado";
                    request.setAttribute("acao", acao);                    
                }
                
                request.setAttribute("user", user);
                return mapping.findForward("okuser");
            }

        } else {
            saveErrors(request, erro);
            return mapping.findForward("erro_newuser");
        }
    }    
}

Se quiserem olhar mais algum podem dizer.

Mas então, olhando no debug chega tudo certo ai ela salva e depois na hora do commit ele me traz esse erro.

Talvez seja algo no mapeamento??

segue as classes

Usuarios

package MZSuporte.model;

import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "usuarios")
public class Usuarios implements Serializable {

    @Id
    @GeneratedValue
    private String id;

    private String nome;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "area")    
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Area area;

    private String ramal;
    
    private String baia;

//getters & setters
}
Area
package MZSuporte.model;

import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "area")
public class Area implements java.io.Serializable {

    @Id
    @GeneratedValue
    private String id;

    private String nome;

    private String area;

    @OneToMany(mappedBy="area", fetch = FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    private Collection<Usuarios> usuarios;

//getters & setters
}
G

A coluna “nome” não pode ser nula.

rchgonzaga

como disse no post la em cima … a coluna nome da nula … tenta inserir um direto … sem passar pelo formulario !! veja se ele inclui desta forma!

G

Está faltando mapeamento nas suas classes “Usuario” e “Area”.

vinicius_roc

Funcionou

o nome que estava faltando ero o da Area ai setei ele com qualquer valor e funcionou. Tudo bem que atualizou no BD ai tive que arrumar o nome mas ta certo, persistencia. hehe

Vou resolver fazendo um load da area. user.setArea = session.load(Area.class, idarea);

Valew pessoal.

Só mais uma duvida, no load tanto faz o tipo do idarea? ou tem algum especifico?

Abss

rchgonzaga

Como assim ?? num tendi …

vinicius_roc

O nome que ele dizia que não podia ser nulo era o nome da area

e no jsp eu pegava todos os dados referente ao usuario mas não pegava nada em relação a area com exceção do id. Então para resolver eu vou adicionar uma linha que pega o resto das informações do banco.

E minha duvida foi se na hora de chamar o load do hibernate, se o id precisa ser de um tipo espeficifico ou se tanto faz (String, Integer, Long, …)

rchgonzaga

vinicius_roc:
O nome que ele dizia que não podia ser nulo era o nome da area

e no jsp eu pegava todos os dados referente ao usuario mas não pegava nada em relação a area com exceção do id. Então para resolver eu vou adicionar uma linha que pega o resto das informações do banco.

E minha duvida foi se na hora de chamar o load do hibernate, se o id precisa ser de um tipo espeficifico ou se tanto faz (String, Integer, Long, …)

Ahhhh ta, no caso o ID tem que ser o mesmo que esta mapeado na sua entidade … se for Long … int … String … etc

vinicius_roc

Valeeew

Criado 3 de julho de 2009
Ultima resposta 3 de jul. de 2009
Respostas 14
Participantes 3