Hibernate - problema ao inserir vários dados

4 respostas
Baldao

Pessoal, estou desenvolvendo uma pequena aplicação web em que cadastro artistas e suas músicas. Há um método que recebe o id do artista e o nome da música e salva no banco, e outro que recebe o id e uma lista de músicas para salvar. Eis o método:

public static void addMusicstoArtist(Long id, List<String> musicas) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        Artista artista = (Artista) session.load(Artista.class, id);
        
        for (int i = 0; i &lt musicas.size(); i++) {
            artista.getMusicas().add(musicas.get(i));
        }
        
        session.getTransaction().commit();
    }

O método que recebe apenas uma música salva normalmente, agora esse com a lista gera o seguinte:

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:235)
	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)
	musicas.PreecheArtistas.addMusicstoArtist(PreecheArtistas.java:52)
	musicas.PreecheArtistas.exec(PreecheArtistas.java:103)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:66)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

Agradecria se alguém puder me ajudar

4 Respostas

sergiolopes

Tente fazer o contrario: ao inves de adicionar Musica à lista de musicas no Artista, adicione o artista à musica.

Algo assim:

for (int i = 0; i &lt musicas.size(); i++) {
        musicas.get(i).setArtista(artista);
        session.save(musicas.get(i));
}

Isso supondo que voce tem um relacionamento ManyToOne

Baldao

Entendi... já estou fazendo as modificações necessárias! Obrigado.

Mas vc saberia me explicar porque o erro ocorre com a lista, porque com esse método:

public static void addMusictoArtist(Long id, String musica) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        Artista artista = (Artista) session.load(Artista.class, id);
        
        artista.getMusicas().add(musica);
        
        session.getTransaction().commit();
    }

Funciona normalmente...

De qualquer forma, obrigado

sergiolopes

Humm… eu não tinha percebido que sua musica era uma String.
Não seria mais interessante a musica ser uma entidade tambem, Musica? E ter um relacionamento mesmo?

Baldao

sim, eu tenho que concordar… hehe
Já estou modificando aqui

Criado 29 de abril de 2007
Ultima resposta 29 de abr. de 2007
Respostas 4
Participantes 2