Erro no Struts + Hibernate

9 respostas
diogoprosoft

Galera me ajudem a visualizar onde estou errando!!!

Minha classe Conta

@Entity
@Table(name = "conta")
public class Conta implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @Id    
    @Column(name = "idconta", nullable = false)
    private Long idconta;
    
    @Column(name = "datacadastro")
    private Date datacadastro;
    
    @Column(name = "nome", nullable = false)
    private String nome;
    
    @Column(name = "obs")
    private String obs;

ContaForm

public class ContaForm extends org.apache.struts.action.ActionForm {
    
    private Long id;
    private Date dataCadastro;
    private String nome = "";
    private String obs = "";

    Conta conta = new Conta();
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getObs() {
        return obs;
    }

    public void setObs(String obs) {
        this.obs = obs;
    }   
    
   public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
       ActionErrors errors = new ActionErrors();
       if (getNome() == null || getNome().length() < 1) {
           errors.add("nome", new ActionMessage("error.nome.required"));

       }
       return errors;
   }
    
}

ContaAction

public class ContaAction extends DispatchAction {
    
private final static String SUCCESS = "success";    
           
    public ActionForward salvar(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
           
        HttpSession session = request.getSession();
        
        ContaForm contaForm = (ContaForm) form;
        Conta conta = new Conta();
        BeanUtils.copyProperties(conta, contaForm);
        
        PersistenciaDAO persistencia = new PersistenciaDAO();
        
        persistencia.salvar(conta);
        
        return mapping.findForward(SUCCESS);        
                
    }

Persistencia DAO

public class PersistenciaDAO {                   
    
    public void salvar(Object object) throws Exception{
                        
       Session sessao = HibernateFactory.getSession();
       Transaction transacao = sessao.beginTransaction();
        
       sessao.saveOrUpdate(object);
       sessao.flush();
       transacao.commit();
       sessao.close();
       
    }

HibernateFactory

public class HibernateFactory {

    private static SessionFactory factory;

    static {
        AnnotationConfiguration cfg = new AnnotationConfiguration();
        
        cfg.addAnnotatedClass(Conta.class);
  
        factory = cfg.buildSessionFactory();
     }
    
    public static Session getSession() {
        return factory.openSession();
    }
    
}

JSP

<html:html locale="true">
    <head>                    
        <title><bean:message key="titulo"/></title>
    <html:base/>
    </head>
    <body>
        <html:form action="conta" focus="id">
            <html:hidden property="method" value="salvar"/>           
            Id:<html:text property="id"/>
            Data_Cadastro<html:text property="dataCadastro"/>
            Nome:<html:text property="nome"/>
            Obs:<html:text property="obs"/>
            <html:submit value="Salvar"/>
        </html:form>
    </body>
</html:html>

Preciso muito da ajuda de vcs estou o dia todo quebrando a cabeça e não saio da arapuca

9 Respostas

fiaux

Qual o problema exatamente? Mensagem de erro, sei lá…

diogoprosoft

Puxa esqueci de colocar o erro :slight_smile:

javax.servlet.ServletException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): conta.bean.Conta
	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:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): conta.bean.Conta
	org.hibernate.id.Assigned.generate(Assigned.java:33)
	org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
	org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
	org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
	hibernate.PersistenciaDAO.salvar(PersistenciaDAO.java:21)
	conta.action.ContaAction.salvar(ContaAction.java:37)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
	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:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
fiaux

Faltou o id das instâncias para salvar no banco. Você pode usar o gerador automático. Olhe esse link, e procure mais informações também. http://www.roseindia.net/hibernate/incrementgenerator.shtml

fiaux

Não sei se a annotation é suficiente, ou se tem que configurar algo mais.

No atributo id @GeneratedValue( strategy = GenerationType.IDENTITY )

fiaux

Dá uma pesquisada melhor nisso aí pois eu fiz isso há muito tempo em xml mesmo. Hoje em dia eu já peguei um projeto pronto e não mexi, está com annotation.

J

o erro é que no form/jsp o nome do campo id é “id” e no bean Conta o nome é “idconta”.

então quando você faz BeanUtils.copyProperties(conta, contaForm); ele não copia o campo id… já que o nome está diferente

fiaux

jukkinha:
o erro é que no form/jsp o nome do campo id é “id” e no bean Conta o nome é “idconta”.

então quando você faz BeanUtils.copyProperties(conta, contaForm); ele não copia o campo id… já que o nome está diferente

O que aconteceu foi que o generate falhou. Se o id deveria estar sendo copiado e não rola por causa de nome diferente, quem tem que dizer é ele.
diogoprosoft você está setando o id que vai pro banco manualmente ou vai gerar automaticamente?

public class IdentifierGenerationException
extends HibernateException

Thrown by IdentifierGenerator implementation class when ID generation fails.

diogoprosoft

no momento estou gerando manualmente.
arrumei o id e coloquei todos eles como idconta

o erro agora é esse:

javax.servlet.ServletException: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	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:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
	org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
	org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
	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)
	hibernate.PersistenciaDAO.salvar(PersistenciaDAO.java:22)
	conta.action.ContaAction.salvar(ContaAction.java:37)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
	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:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
diogoprosoft

blz galara funcionou, mudei os id para idconta em todos compilei, blz funciou

Valeu pela ajuda de vcs :lol:

Criado 5 de junho de 2008
Ultima resposta 5 de jun. de 2008
Respostas 9
Participantes 3