Bom dia, estou com o seguinte problema muito estranho…
Estou usando o Jelastic como servidor, com mysql 5.5 e tomcat 7… as mesmas versões que uso no meu computador.
Mas, no meu computador funciona tudo normalmente, e no servidor quando tento excluir o Cliente da o seguinte erro do Hibernate:
org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query
E no meu computador funciona normalmente, não consigo entender… alguém tem uma luz?
Verifiquei e encontrei o erro…
Quando eu deleto o cliente, faço uma lista de contatos pra deletar… mas ele exclui a tabela CONTATO, quando substitui por Contato deu certo…
Só não entendo porque está diferença nas letras maiúsculas não deu problema no meu computador… de qualquer forma, foi resolvido pelo menos…
Mas gostaria de saber se tem uma solução para o servidor não diferenciar letras maiúsculas/minusculas nos nomes das tabelas…
tmvolpato
clarel.filho:
Verifiquei e encontrei o erro…
Quando eu deleto o cliente, faço uma lista de contatos pra deletar… mas ele exclui a tabela CONTATO, quando substitui por Contato deu certo…
Só não entendo porque está diferença nas letras maiúsculas não deu problema no meu computador… de qualquer forma, foi resolvido pelo menos…
Mas gostaria de saber se tem uma solução para o servidor não diferenciar letras maiúsculas/minusculas nos nomes das tabelas…
eu utilizo PostgreSQL
e não tenho problema qto a isso
eu faço dessa maneira
e lá no meu banco está sempre em minusculo o nome da tablela
você executa query nativa para exclusão no banco?
C
clarel.filho
Pois é, na minha máquina local… com Windows também nunca tive problemas quanto a isso… mas o servidor é linux, pode ser por isso?
Não sei se é query nativa… não sei o que é isto… mas segue o código para você ver:
Cliente:
public void excluirPorCliente(Cliente cliente)
{
session.createSQLQuery(
"DELETE from Contato where cliente=" + cliente.getCodigo())
.executeUpdate();
}
tmvolpato
você não precisa desse método
public void excluirPorCliente(Cliente cliente)
{
session.createSQLQuery(
"DELETE from Contato where cliente=" + cliente.getCodigo())
.executeUpdate();
}
pq no código de cima você já vai deletar o cliente
tem coisa a mais no seu código ai
C
clarel.filho
Pois é, mas se eu não executar isto… os contatos vão continuar cadastrados né?
mas os contatos são uma lista de contatos do cliente, então quando deleto o cliente eu gostaria de deletar o contato pra não deixar “sujeira”…
Pelo o que eu entendi, você disse para eu deletar apenas o cliente e deixar os contatos né?
tmvolpato
clarel.filho:
Pois é, mas se eu não executar isto… os contatos vão continuar cadastrados né?
mas os contatos são uma lista de contatos do cliente, então quando deleto o cliente eu gostaria de deletar o contato pra não deixar “sujeira”…
Pelo o que eu entendi, você disse para eu deletar apenas o cliente e deixar os contatos né?
O correto é assim
O cliente possui um ou mais contatos certo
entao ao excluir um Cliente seu contatos tbm tem que ser excluidos automaticamente
isso é tratado no seu relacionamento
deixe eu vê a classe Cliente e Contato
@ComponentpublicclassClienteDao{privatefinalSessionsession;publicClienteDao(Sessionsession){this.session=session;}publicClientecarrega(Longcodigo){return(Cliente)this.session.load(Cliente.class,codigo);}publicvoidatualiza(Clientecliente){Transactiontx=session.beginTransaction();this.session.update(cliente);tx.commit();}publicvoidremove(Clientecliente){ContatoDaodao=newContatoDao(session);dao.excluirPorCliente(cliente);Transactiontx=session.beginTransaction();this.session.delete(cliente);tx.commit();}publicvoidsalva(Clientecliente){Transactiontx=session.beginTransaction();session.save(cliente);tx.commit();}@SuppressWarnings("unchecked")publicList<Cliente>listaTudo(){Queryquery=session.createQuery("from Cliente ORDER BY nome ASC");returnsession.createCriteria(Cliente.class).addOrder(Order.asc("nome")).list();}}
ContatoDao
@ComponentpublicclassContatoDao{privatefinalSessionsession;publicContatoDao(Sessionsession){this.session=session;}publicContatocarrega(Longcodigo){return(Contato)this.session.load(Contato.class,codigo);}publicvoidatualiza(Contatocontato){Transactiontx=session.beginTransaction();this.session.update(contato);tx.commit();}publicvoidremove(Contatocontato){Transactiontx=session.beginTransaction();this.session.delete(contato);tx.commit();}publicvoidsalva(Contatocontato){Transactiontx=session.beginTransaction();session.save(contato);tx.commit();}@SuppressWarnings("unchecked")publicList<Contato>listarPorCliente(Longcodigo){Queryquery=session.createQuery("from Contato WHERE cliente.codigo = :codigo_cliente ORDER BY nome ASC");query.setParameter("codigo_cliente",codigo);returnquery.list();}@SuppressWarnings("unchecked")publicList<Contato>listar(){Queryquery=session.createQuery("from Contato ORDER BY nome ASC");returnquery.list();}publicvoidexcluirPorCliente(Clientecliente){session.createSQLQuery("DELETE from Contato where cliente="+cliente.getCodigo()).executeUpdate();}
está tudo ai!
tmvolpato
olha assim
vc tem relacionamento apenas de um lado unidirecional
o certo seria esse relacionamento está no cliente ou em ambos bidirecional no caso
procure sobre isso na internet
caso tenha mais duvida só volta aqui
Posso até passa o jeito correto de fazer mas dai você sempre vai cair nessa duvida
eu prefiro que vc procure no google por agora e se não conseguir eu te ajudo
C
clarel.filho
Ok, vou dar uma olhada! obrigado!
tmvolpato
se nao conseguir volta ai que dai a gente resolve isso
C
clarel.filho
Amigo, tentei de verdade… principalmente através deste link…
mas não consegui fazer esse relacionamente, e nem como listar e deletar os contatos do cliente…
consegue dar mais uma luz?
C
clarel.filho
consegui fazer, mas as seguintes funções estão com problema:
@SuppressWarnings("unchecked")publicList<Contato>listarPorCliente(Longcodigo){returnsession.createCriteria(Contato.class)..addOrder(Order.asc("nome")).list();}publicvoidexcluirPorCliente(Clientecliente){session.createSQLQuery("DELETE from contato where cliente="+cliente.getCodigo()).executeUpdate();}
o fetch = “FetchType.EAGER” faz com que quando eu use getContatos… ele traga automaticamente os contatos apenas deste cliente, e o “cascade=CascadeType.REMOVE” faz com que delete automaticamente os contatos do cliente, quando o cliente é deletado…
agora não preciso mais das funções que eu havia feito.