Problema ao excluir no Vraptor[Resolvido]

10 respostas
Leonardo_Gloria

Galera, estou seguindo a apostila FJ-28 da Caelum, a parte do Vraptor onde cria, lista e remove usuários esta ok.
Quando eu começo a mecher com a classe Cd dá pau na hora de Deletar... apresenta o seguinte erro:

Exception in thread "main" org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:146)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at dao.DaoFactory.commit(DaoFactory.java:31)
        at testes.TestaDaoGenerico.main(TestaDaoGenerico.java:35)
Caused by: java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction
        at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1666)
        at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1082)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
        ... 9 more
Java Result: 1
Classe Cd:
@Entity
public class Cd implements Serializable {

    @Id
    @GeneratedValue
    private Long id;
    private String titulo;
    private String artista;
    private String genero;

    public Cd() {
    }

    public String getArtista() {
        return artista;
    }

    public void setArtista(String artista) {
        this.artista = artista;
    }

    public String getGenero() {
        return genero;
    }

    public void setGenero(String genero) {
        this.genero = genero;
    }

    public Long getId() {
        return id;
    }

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

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}

Uma luz por favor, to quebrando a cabeça e não consigo resolver..

10 Respostas

Regis_A_Rocha

posta sua classe Logic

Lucas_Cavalcanti

tá tudo ok com seu banco de dados?
você tá abrindo e fechando as sessões?
você tá abrindo e fechando as transações?

Leonardo_Gloria
@Component("cd")
@InterceptedBy(DaoInterceptor.class)
public class CdLogic {

    private final DaoFactory factory;
    @Out
    private Cd cd;
    private List<Cd> cds;

    public CdLogic(DaoFactory factory) {
        this.factory = factory;
    }

    public void adiciona(Cd cd) {
        this.factory.beginTransaction();
        this.factory.getCdDao().adiciona(cd);
        this.factory.commit();
    }

    public void remove(Cd cd) {
        this.factory.beginTransaction();
        this.factory.getCdDao().remove(cd);
        this.factory.commit();
    }

    public void editar(Cd cd) {
        this.cd = this.factory.getCdDao().buscaById(cd.getId());
    }

    public void armazena(Cd cd) {
        this.factory.beginTransaction();
        this.factory.getCdDao().atualiza(cd);
        this.factory.commit();
    }

    public void lista() {
        this.cds = this.factory.getCdDao().listaTudo();
    }

    public void formulario() {
    }

    public Cd getCd() {
        return cd;
    }

    public List<Cd> getCds() {
        return cds;
    }
    public DaoFactory getDaoFactory(){
        return this.factory;
    }



}
Ta ai meu cd logic... Pow, eu to usando a mesma lógica para remover usuarios! Nessa ai tah retornando esse erro... Tah queimando neurônio aki pra matar isso! Vlw Galera
G

O que está sendo estranho para mim é essa mensagem na linha 15 do log :

Lock wait timeout exceeded; try restarting transaction

Leonardo_Gloria

Falae, pow, eu rodei agora de dentro do JSP.. deu esse erro aki..

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

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

exception 

javax.servlet.ServletException: Could not execute JDBC batch update
	org.vraptor.http.DefaultDispatcher.dispatch(DefaultDispatcher.java:69)
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:48)
	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:146)
	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)
	dao.DaoFactory.commit(DaoFactory.java:31)
	logic.CdLogic.remove(CdLogic.java:40)
	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.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:61)
	org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:32)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:130)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:41)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:57)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	logic.DaoInterceptor.intercept(DaoInterceptor.java:22)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:22)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:47)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:97)
	org.vraptor.core.DefaultController.execute(DefaultController.java:46)
	org.vraptor.http.DefaultDispatcher.dispatch(DefaultDispatcher.java:44)
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:48)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 

java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`loja/musica`, CONSTRAINT `FK8A0BC2FC8DD566C2` FOREIGN KEY (`cd_id`) REFERENCES `cd` (`id`))
	com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1666)
	com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1082)
	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:146)
	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)
	dao.DaoFactory.commit(DaoFactory.java:31)
	logic.CdLogic.remove(CdLogic.java:40)
	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.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:61)
	org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:32)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:130)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:41)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:57)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	logic.DaoInterceptor.intercept(DaoInterceptor.java:22)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:22)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:47)
	org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:97)
	org.vraptor.core.DefaultController.execute(DefaultController.java:46)
	org.vraptor.http.DefaultDispatcher.dispatch(DefaultDispatcher.java:44)
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:48)
	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.


--------------------------------------------------------------------------------

Apache Tomcat/6.0.18
meu views.properties
# To change this template, choose Tools | Templates
# and open the template in the editor.
usuario.adiciona.ok = usuario.lista.logic
usuario.remove.ok = usuario.lista.logic
cd.armazena.ok = cd.lista.logic
cd.remove.ok = cd.lista.logic
cd.editar.ok = cd/formulario.ok.jsp

Ainda na luta!

Lucas_Cavalcanti

Tá dando erro de violação de constrant do banco quando vocẽ remove… algum relacionamento da sua classe quebra e dá isso

Leonardo_Gloria

Pow, a unioca coisa q eu coloquei um relacionamento foi na classe Musica… tem um kara do tipo Cd tem um @ManyToOne
Será que é isso?

Lucas_Cavalcanti

muito provavelmente… vc deixou relacionamentos órfãos, e seu BD não gostou disso

Lavieri

vc esta tentando deletar, e o relacioanmento não deicha…

solução ou tira a restrição do banco, ou remove em castcata… quando remover um, remove todos os filhos… para tal vc precisa mapear um propriedade a mais no CD, com a lista de musicas… colocar as musicas com a prpriedade cascade.ALL e depois deletar…

outra forma é antes de deletar um CD, pegar sua lista de musica, visa consulta, e deletar todas as musicas

Leonardo_Gloria

vc esta tentando deletar, e o relacioanmento não deicha…

solução ou tira a restrição do banco, ou remove em castcata… quando remover um, remove todos os filhos… para tal vc precisa mapear um propriedade a mais no CD, com a lista de musicas… colocar as musicas com a prpriedade cascade.ALL e depois deletar…

outra forma é antes de deletar um CD, pegar sua lista de musica, visa consulta, e deletar todas as musicas

Valeu Rapazeada, valeu Lavieri, removi a constaint no banco e agora tah funfando blzinha!!

[]s!

Criado 13 de outubro de 2009
Ultima resposta 14 de out. de 2009
Respostas 10
Participantes 5