Pessoal, dps de 1 pesquisada fiz os seguintes mapeamentos:
cliente.hbm.xml - nao alterou nada
[code]<?xml version="1.0" encoding="UTF-8"?>
<class name="loja.Cliente" table="cliente">
<id name="id" type="integer" column="id">
<generator class="increment"/>
</id>
<property name="nome" type="string" column="nome"/>
<property name="endereco" type="string" column="endereco"/>
<property name="bairro" type="string" column="bairro"/>
<property name="numero" type="integer" column="numero"/>
<property name="cidade" type="string" column="cidade"/>
<property name="estado" type="string" column="estado"/>
<property name="cep" type="string" column="cep"/>
<property name="forma_pagamento" type="string" column="forma_pagamento"/>
<property name="info_pagamento" type="string" column="info_pagamento"/>
<property name="data" type="date" column="data"/>
<set name="produtos"
table="pedido">
<key column="fk_cliente"/>
<many-to-many class="loja.Produto" column="fk_produto"/>
</set>
</class>
[/code]
produto.hbm.xml - tb nao alterou nada
[code]<?xml version="1.0" encoding="UTF-8"?>
<class name="loja.Produto" table="produto">
<id name="id" type="integer" column="id">
<generator class="increment"/>
</id>
<property name="nome" type="string" column="nome"/>
<property name="descricao" type="string" column="descricao"/>
<property name="preco" type="float" column="preco"/>
<property name="promocao" type="char" column="promocao"/>
<set name="clientes"
table="pedido"
inverse="true">
<key column="fk_produto"/>
<many-to-many class="loja.Cliente" column="fk_cliente"/>
</set>
</class>
[/code]
pedido.hbm.xml - esse sofreu alteracoes
[code]<?xml version="1.0" encoding="UTF-8"?>
<class name="loja.Pedido" table="pedido">
<composite-id name="id" class="loja.PedidoPK">
<key-property name="fk_produto" type="integer" column="fk_produto"/>
<key-property name="fk_cliente" type="integer" column="fk_cliente"/>
</composite-id>
<property name="quantidade" type="integer" column="quantidade"/>
</class>
[/code]
E ainda criei a classe PedidoPK e alterei a classe Pedido
Pedido
[code]package loja;
import java.io.Serializable;
public class Pedido implements Serializable {
private PedidoPK id;
private Integer quantidade;
/** Creates a new instance of Pedido */
public Pedido() {
}
public Integer getQuantidade() {
return quantidade;
}
public void setQuantidade(Integer quantidade) {
this.quantidade = quantidade;
}
public PedidoPK getId() {
return id;
}
public void setId(PedidoPK id) {
this.id = id;
}
}[/code]
PedidoPK
[code]package loja;
import java.io.Serializable;
public class PedidoPK implements Serializable {
private Integer fk_produto;
private Integer fk_cliente;
/** Creates a new instance of PedidoPK */
public PedidoPK() {
}
public Integer getFk_produto() {
return fk_produto;
}
public void setFk_produto(Integer fk_produto) {
this.fk_produto = fk_produto;
}
public Integer getFk_cliente() {
return fk_cliente;
}
public void setFk_cliente(Integer fk_cliente) {
this.fk_cliente = fk_cliente;
}
}[/code]
A classe main:
[code]package loja;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Teste {
public static void main(String[] args) {
Session sessao = HibernateUtil.getSession(); //Abrindo uma sessão
Transaction transaction = sessao.beginTransaction(); //Iniciando uma transação
//Instaciando Produto
Produto produto = new Produto();
produto.setNome("joia");
produto.setDescricao("joia de diamante");
produto.setPreco(new Float(100));
produto.setPromocao('n');
//Instanciando cliente
Cliente cliente = new Cliente();
cliente.setNome("maria");
cliente.setEndereco("rua bla bla");
cliente.setBairro("bessa");
cliente.setNumero(new Integer(10));
cliente.setCidade("Joao Pessoa");
cliente.setEstado("Paraiba");
cliente.setCep("58034-240");
cliente.setForma_pagamento("cartao");
cliente.setInfo_pagamento("visa-01234567892");
cliente.setData(new Date());
//Insert em Produto e Cliente
Integer idProduto = (Integer) sessao.save(produto);
Integer idCliente = (Integer) sessao.save(cliente);
transaction.commit();
sessao.close();
sessao = HibernateUtil.getSession();
transaction = sessao.beginTransaction();
//Fazendo a associacao N:N entre Cliente e Produto e gravando na tabela Pedido
produto = (Produto)sessao.get(Produto.class, idProduto);
cliente = (Cliente)sessao.get(Cliente.class, idCliente);
cliente.getProdutos().add(produto);
produto.getClientes().add(cliente);
PedidoPK pedidoPK = new PedidoPK();
pedidoPK.setFk_cliente(idCliente);
pedidoPK.setFk_produto(idProduto);
Pedido pedido = new Pedido();
//pedido.setFk_cliente(idCliente);
//pedido.setFk_produto(idProduto);
pedido.setId(pedidoPK);
pedido.setQuantidade(new Integer(3));
//Salvando tudo
sessao.update(cliente);
sessao.update(produto);
sessao.save(pedido);
//persistente no banco de dados
transaction.commit(); //Finalizando a transação
sessao.close(); //Fechando a sessão
}
}[/code]
Erro:
14:07:17,936 DEBUG JDBCExceptionReporter:69 - Could not execute JDBC batch update [/* insert collection row loja.Cliente.produtos */ insert into pedido (fk_cliente, fk_produto) values (?, ?)]
java.sql.BatchUpdateException: Entrada em lote 0 /* insert collection row loja.Cliente.produtos */ insert into pedido (fk_cliente, fk_produto) values (5, 8) foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2530)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2592)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
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 loja.Teste.main(Teste.java:59)
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
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:144)
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 loja.Teste.main(Teste.java:59)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 /* insert collection row loja.Cliente.produtos */ insert into pedido (fk_cliente, fk_produto) values (5, 8) foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2530)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2592)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 8 more
14:07:17,967 WARN JDBCExceptionReporter:77 - SQL Error: 0, SQLState: null
14:07:17,967 ERROR JDBCExceptionReporter:78 - Entrada em lote 0 /* insert collection row loja.Cliente.produtos */ insert into pedido (fk_cliente, fk_produto) values (5, 8) foi abortada. Chame getNextException para ver a causa.
14:07:17,967 WARN JDBCExceptionReporter:77 - SQL Error: 0, SQLState: 23505
14:07:17,967 ERROR JDBCExceptionReporter:78 - ERROR: duplicate key violates unique constraint "pedido_pkey"
14:07:17,967 ERROR AbstractFlushingEventListener:301 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
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:144)
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 loja.Teste.main(Teste.java:59)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 /* insert collection row loja.Cliente.produtos */ insert into pedido (fk_cliente, fk_produto) values (5, 8) foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2530)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2592)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 8 more
14:07:18,014 DEBUG ConnectionManager:478 - registering flush end
Java Result: 1
O mapeamento de Cliente e Produto continuam o msm da primeira pagina.
Nao sei pq ta dando esse erro.
Acho q n to acertando na hora de gravar. ALguem sabe oq ta errado?