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?
Atenciosamente, Clarel
1° passo
Verificou se as tabelas foram criadas no banco?
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…
[quote=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… [/quote]
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?
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 remove(Cliente cliente) {
ContatoDao dao = new ContatoDao(session);
dao.excluirPorCliente(cliente);
Transaction tx = session.beginTransaction();
this.session.delete(cliente);
tx.commit();
}
public void excluirPorCliente(Cliente cliente)
{
session.createSQLQuery(
"DELETE from Contato where cliente=" + cliente.getCodigo())
.executeUpdate();
}
você não precisa desse método
[code] public void excluirPorCliente(Cliente cliente)
{
session.createSQLQuery(
"DELETE from Contato where cliente=" + cliente.getCodigo())
.executeUpdate();
} [/code]
pq no código de cima você já vai deletar o cliente
tem coisa a mais no seu código ai
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é?
[quote=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é?[/quote]
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
para ver como está esse relacionamento
Cliente:
@Entity
public class Cliente {
@Id
@GeneratedValue
@NotNull
private Long codigo;
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome.toUpperCase();
}
public String getRazao() {
return razao;
}
public void setRazao(String razao) {
this.razao = razao.toUpperCase();
}
public String getTipoDePessoa() {
return tipoDePessoa;
}
public void setTipoDePessoa(String tipoDePessoa) {
this.tipoDePessoa = tipoDePessoa.toUpperCase();
}
public String getTelefone1() {
return telefone1;
}
public void setTelefone1(String telefone1) {
this.telefone1 = telefone1;
}
public String getTelefone2() {
return telefone2;
}
public void setTelefone2(String telefone2) {
this.telefone2 = telefone2;
}
public String getFax() {
return fax;
}
public void setFax(String fax) {
this.fax = fax;
}
public String getCnpjCpf() {
return cnpjCpf;
}
public void setCnpjCpf(String cnpjCpf) {
this.cnpjCpf = cnpjCpf;
}
public String getIe() {
return ie;
}
public void setIe(String ie) {
this.ie = ie;
}
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade.toUpperCase();
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco.toUpperCase();
}
public String getObservacoes() {
return observacoes;
}
public void setObservacoes(String observacoes) {
this.observacoes = observacoes;
}
public String getCep() {
return cep;
}
public void setCep(String cep) {
this.cep = cep;
}
public String getUf() {
return uf;
}
public void setUf(String uf) {
this.uf = uf.toUpperCase();
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email.toLowerCase();
}
public String getEstadoCivil() {
return estadoCivil;
}
public void setEstadoCivil(String estadoCivil) {
this.estadoCivil = estadoCivil.toUpperCase();
}
public String getProfissao() {
return profissao;
}
public void setProfissao(String profissao) {
this.profissao = profissao.toUpperCase();
}
@Column(length = 60, nullable = false)
private String nome;
@Column(length = 60, nullable = false)
private String razao;
@Column(length = 1, nullable = false)
private String tipoDePessoa;
@Column(length = 20, nullable = true)
private String telefone1;
@Column(length = 20, nullable = true)
private String telefone2;
@Column(length = 20, nullable = true)
private String fax;
@Column(length = 18, nullable = true)
private String cnpjCpf;
@Column(length = 20, nullable = true)
private String ie;
@Column(length = 50, nullable = true)
private String cidade;
@Column(length = 50, nullable = true)
private String endereco;
@Column(length = 255, nullable = true)
private String observacoes;
@Column(length = 15, nullable = true)
private String cep;
@Column(length = 2, nullable = false)
private String uf;
@Column(length = 50, nullable = true)
private String email;
@Column(length = 1, nullable = false)
private String estadoCivil;
@Column(length = 20, nullable = true)
private String profissao;
}
Contato:
@Entity
public class Contato {
@Id
@GeneratedValue
@NotNull
private long codigo;
@ManyToOne
@JoinColumn(name = "cliente")
private Cliente cliente;
@Column(length = 60, nullable = false)
private String nome;
@Column(length = 20, nullable = true)
private String telefone1;
@Column(length = 50, nullable = true)
private String email;
@Column(length = 255, nullable = true)
private String observacoes;
public String getObservacoes() {
return observacoes;
}
public void setObservacoes(String observacoes) {
this.observacoes = observacoes;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email.toLowerCase();
}
public String getTelefone1() {
return telefone1;
}
public void setTelefone1(String telefone) {
this.telefone1 = telefone;
}
public long getCodigo() {
return codigo;
}
public void setCodigo(long codigo) {
this.codigo = codigo;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome.toUpperCase();
}
}
ClienteDao
@Component
public class ClienteDao {
private final Session session;
public ClienteDao(Session session) {
this.session = session;
}
public Cliente carrega(Long codigo) {
return (Cliente) this.session.load(Cliente.class, codigo);
}
public void atualiza(Cliente cliente) {
Transaction tx = session.beginTransaction();
this.session.update(cliente);
tx.commit();
}
public void remove(Cliente cliente) {
ContatoDao dao = new ContatoDao(session);
dao.excluirPorCliente(cliente);
Transaction tx = session.beginTransaction();
this.session.delete(cliente);
tx.commit();
}
public void salva(Cliente cliente) {
Transaction tx = session.beginTransaction();
session.save(cliente);
tx.commit();
}
@SuppressWarnings("unchecked")
public List<Cliente> listaTudo() {
Query query = session.createQuery("from Cliente ORDER BY nome ASC");
return session.createCriteria(Cliente.class)
.addOrder(Order.asc("nome")).list();
}
}
ContatoDao
@Component
public class ContatoDao
{
private final Session session;
public ContatoDao(Session session)
{
this.session = session;
}
public Contato carrega(Long codigo)
{
return (Contato) this.session.load(Contato.class, codigo);
}
public void atualiza(Contato contato)
{
Transaction tx = session.beginTransaction();
this.session.update(contato);
tx.commit();
}
public void remove(Contato contato)
{
Transaction tx = session.beginTransaction();
this.session.delete(contato);
tx.commit();
}
public void salva(Contato contato)
{
Transaction tx = session.beginTransaction();
session.save(contato);
tx.commit();
}
@SuppressWarnings("unchecked")
public List<Contato> listarPorCliente(Long codigo)
{
Query query = session
.createQuery("from Contato WHERE cliente.codigo = :codigo_cliente ORDER BY nome ASC");
query.setParameter("codigo_cliente", codigo);
return query.list();
}
@SuppressWarnings("unchecked")
public List<Contato> listar()
{
Query query = session.createQuery("from Contato ORDER BY nome ASC");
return query.list();
}
public void excluirPorCliente(Cliente cliente)
{
session.createSQLQuery(
"DELETE from Contato where cliente=" + cliente.getCodigo())
.executeUpdate();
}
está tudo ai!
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
Ok, vou dar uma olhada! obrigado!
se nao conseguir volta ai que dai a gente resolve isso
Amigo, tentei de verdade… principalmente através deste link…
http://www.guj.com.br/java/197970-duvida-relacionamento-bidirecional—jpa–hibernate
mas não consegui fazer esse relacionamente, e nem como listar e deletar os contatos do cliente…
consegue dar mais uma luz?
consegui fazer, mas as seguintes funções estão com problema:
@SuppressWarnings("unchecked")
public List<Contato> listarPorCliente(Long codigo)
{
return session.createCriteria(Contato.class).
.addOrder(Order.asc("nome")).list();
}
public void excluirPorCliente(Cliente cliente)
{
session.createSQLQuery(
"DELETE from contato where cliente=" + cliente.getCodigo())
.executeUpdate();
}
olhei aki:
http://uaihebert.com/?p=1622&page=20
Consegui resolver o problema do relacionamento, ficou muito bom!
segue como ficou:
Na classe cliente:
@OneToMany(mappedBy = "cliente",fetch = FetchType.EAGER,cascade=CascadeType.REMOVE)
private List<Contato> contatos;
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.
no Contato:
@ManyToOne
@JoinColumn(name = "cliente")
private Cliente cliente;
Muito obrigado Thiago, agora sei como seguir em frente com o hibernate! hehe
Abraço!