Mapeamento Hibernate

23 respostas
H

Pessoal to em duvida em fazer o mapeamento da relacao abaixo, eu consigo fazer mas ele n ta preenchendo a coluna "quantidade", ja rodei uns codigos ai, mas nao encontro igual ao q quero, mas tb acho q n seja dificil, eh q estou me enrrolando nesse mapeamento. Alguem poderia colocar o codigo desse mapeamento?? Vlw...

[img]http://www.myjavaserver.com/~hlds/duvidas/esquema_bd.JPG[/img]

Eh um relacionamento N:N entre CLIENTE e PRODUTO, a tabela do meio eh a PEDIDO.

Vo colocar o codigo de mapeamento q ja fiz, mas falta modificar p cadastrar a coluna "quantidade" de PEDIDO.

CLIENTE.HBM.XML
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<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>
	
</hibernate-mapping>
PRODUTO.HBM.XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<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>

</hibernate-mapping>

Com estes 2 mapeamentos ele ja cadastra nas 3 tabelas, so n preenche a coluna "quantidade". Dai eu fiz 1 mapeamento p PEDIDO p ve se consigo cadastrar a "quantidade", mas n pegou. Segue abaixo:

PEDIDO.HBM.XML
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<class name="loja.Pedido" table="pedido">
	
		<composite-id>
                    <key-many-to-one name="fk_produto" class="loja.Produto" column="fk_produto"/>
                    <key-many-to-one name="fk_cliente" class="loja.Cliente" column="fk_cliente"/>
                </composite-id>
	
		<property name="quantidade" type="integer" column="quantidade"/>
                	
	</class>
	
</hibernate-mapping>

23 Respostas

H

pow, ng nunca fez algo parecido? to ferrado!!! ehehee

carlos.cambra

Dá uma olhada neste tutorial, vai te ajudar !!!

http://www.guj.com.br/java.tutorial.artigo.174.1.guj

F

nossa kra estranho sempre vi assim
Cliente tem varios pedidos e pedidos tem varios itens, pq olhando no seu mapeamento cliente tem varios produtos esta certo, é so vc colocar setar a quantidade e habilitar cascate all que ele deve gravar tudo, adicione a tag insert=true e update=true tbm no mapeamento que tem o composite id.

qualquer coisa estamos ai

Abraços

H

foliveira81:
nossa kra estranho sempre vi assim
Cliente tem varios pedidos e pedidos tem varios itens, pq olhando no seu mapeamento cliente tem varios produtos esta certo, é so vc colocar setar a quantidade e habilitar cascate all que ele deve gravar tudo, adicione a tag insert=true e update=true tbm no mapeamento que tem o composite id.

qualquer coisa estamos ai

Abraços

na verdade esse relacionamento usualmente eh feito assim:

cliente 1:n pedido
pedido n:n produto
e listaItens seria a tabela do meio entre pedido e produto

mas por algumas razoes o mapeamento tem q ser o exposto como fiz, nao eh o normalmente usado, mas creio eu q tb n esteja errado.

vo tentar o q vcs disseram ai, vlw…

H

carlos.cambra:
Dá uma olhada neste tutorial, vai te ajudar !!!

http://www.guj.com.br/java.tutorial.artigo.174.1.guj

ja li 300xesse tutorial, mto bom, mas n tem este mapeemento especifico. ja fui ate no site do hibernate, mapeamento igual n achei. por enqto vo tentando…

H

ng fez tal mapeamento? eh bem usado esse relacionamento de BD. ja rodei d+, vo tentando por enqto…

esb

hlds,

Sinceramente, essa sua modelagem e mapeamento estão um pouco confusos. Mas vamos lá…

Primeiro, uma pergunta: qual das entidades você está tentando persistir? Supondo (você não deixou isso claro) que seja Cliente, já tentou persistir uma coleção de pedidos ao invés de uma coleção de produtos?

Cabral

Cara, eu tive o mesmo problema e ja li em várioas lugares a seguinte mensagem: Não é aconselhavel utilzar chave composta na modelagem do banco.

Mas… se mesmo assim você não tiver como fugir eu não tenho nada pronto aqui mas sei que você tera de usar um cara chamado “COMPOSITE-ID” no google tem algumas coisas falando dele. Veja se te ajuda.

falou!

Ricardo Cabral

H

esb:
hlds,

Sinceramente, essa sua modelagem e mapeamento estão um pouco confusos. Mas vamos lá…

Primeiro, uma pergunta: qual das entidades você está tentando persistir? Supondo (você não deixou isso claro) que seja Cliente, já tentou persistir uma coleção de pedidos ao invés de uma coleção de produtos?

to tentando persistir cliente, produto e pedido

mas se fosse n:n sem coluna em pedido, so precisava persistir cliente e produto

mas como tem a coluna quantidade ai to vendo q tenho q criar um bean p pedido tb.

eu n to achando nd confuso nisso :confused:

mas qlq coisa fala ai q te esclareco

H

Cabral:
Cara, eu tive o mesmo problema e ja li em várioas lugares a seguinte mensagem: Não é aconselhavel utilzar chave composta na modelagem do banco.

Mas… se mesmo assim você não tiver como fugir eu não tenho nada pronto aqui mas sei que você tera de usar um cara chamado “COMPOSITE-ID” no google tem algumas coisas falando dele. Veja se te ajuda.

falou!

Ricardo Cabral

cara ate respeito sua opinao. mas dizer q n eh aconselhavel usar chave composta, eh dizer p n usar um dos relacionamentos basicos de banco, o N:N, isso na minha opiniao n existe. eu utilizei o composite id no mapeamento de pedido, pode ate ver la em cima, mas n acertei em algo

msm assim vlw a juda, por enqto vo tenatndo outras alternativas

esb

hlds:
esb:
hlds,

Sinceramente, essa sua modelagem e mapeamento estão um pouco confusos. Mas vamos lá…

Primeiro, uma pergunta: qual das entidades você está tentando persistir? Supondo (você não deixou isso claro) que seja Cliente, já tentou persistir uma coleção de pedidos ao invés de uma coleção de produtos?

to tentando persistir cliente, produto e pedido

mas se fosse n:n sem coluna em pedido, so precisava persistir cliente e produto

mas como tem a coluna quantidade ai to vendo q tenho q criar um bean p pedido tb.

eu n to achando nd confuso nisso :confused:

mas qlq coisa fala ai q te esclareco

Eu entendi que você quer persistir os três, mas está fazendo isso a partir de qual das três entidades? Em outras palavras, você tá dando o save em qual entidade? Clientes? Ou está dando save separado em cada entidade?

Cabral

hlds:
Cabral:
Cara, eu tive o mesmo problema e ja li em várioas lugares a seguinte mensagem: Não é aconselhavel utilzar chave composta na modelagem do banco.

Mas… se mesmo assim você não tiver como fugir eu não tenho nada pronto aqui mas sei que você tera de usar um cara chamado “COMPOSITE-ID” no google tem algumas coisas falando dele. Veja se te ajuda.

falou!

Ricardo Cabral

cara ate respeito sua opinao. mas dizer q n eh aconselhavel usar chave composta, eh dizer p n usar um dos relacionamentos basicos de banco, o N:N, isso na minha opiniao n existe. eu utilizei o composite id no mapeamento de pedido, pode ate ver la em cima, mas n acertei em algo

msm assim vlw a juda, por enqto vo tenatndo outras alternativas

Cara não é opinião minha, foi apenas o que eu li nos lugares em que procurei quando tive o mesmo problema ;).

o relacionamento que voce procura no hibernate se chama “composite-id”

esse composite-id é o “bean” que voce vai criar . da uma procuradinha que eu acho que tem em portugues…

falou

esb

A solução do Cabral pode funcionar!

H

esb:
hlds:
esb:
hlds,

Sinceramente, essa sua modelagem e mapeamento estão um pouco confusos. Mas vamos lá…

Primeiro, uma pergunta: qual das entidades você está tentando persistir? Supondo (você não deixou isso claro) que seja Cliente, já tentou persistir uma coleção de pedidos ao invés de uma coleção de produtos?

to tentando persistir cliente, produto e pedido

mas se fosse n:n sem coluna em pedido, so precisava persistir cliente e produto

mas como tem a coluna quantidade ai to vendo q tenho q criar um bean p pedido tb.

eu n to achando nd confuso nisso :confused:

mas qlq coisa fala ai q te esclareco

Eu entendi que você quer persistir os três, mas está fazendo isso a partir de qual das três entidades? Em outras palavras, você tá dando o save em qual entidade? Clientes? Ou está dando save separado em cada entidade?

separado em cada, n usei cascade, pq axei q ia dar no msm, mas se resolver meu problema posso usar (apesar q axo q n resolva).

H

Cabral:
hlds:
Cabral:
Cara, eu tive o mesmo problema e ja li em várioas lugares a seguinte mensagem: Não é aconselhavel utilzar chave composta na modelagem do banco.

Mas… se mesmo assim você não tiver como fugir eu não tenho nada pronto aqui mas sei que você tera de usar um cara chamado “COMPOSITE-ID” no google tem algumas coisas falando dele. Veja se te ajuda.

falou!

Ricardo Cabral

cara ate respeito sua opinao. mas dizer q n eh aconselhavel usar chave composta, eh dizer p n usar um dos relacionamentos basicos de banco, o N:N, isso na minha opiniao n existe. eu utilizei o composite id no mapeamento de pedido, pode ate ver la em cima, mas n acertei em algo

msm assim vlw a juda, por enqto vo tenatndo outras alternativas

Cara não é opinião minha, foi apenas o que eu li nos lugares em que procurei quando tive o mesmo problema ;).

o relacionamento que voce procura no hibernate se chama “composite-id”

esse composite-id é o “bean” que voce vai criar . da uma procuradinha que eu acho que tem em portugues…

falou

esse composite-id q vi na documentacao do hibernate eh a tag q usei no Pedido.hbm.xml acima, eh disto q vc ta falando? se nao for, n entendi.

eu tava pensando em tirar os sets de Produto e Cliente, e dx o bean de pedido como ta. Ai faria o casatro de Cliente e Produto e dps cadastraria os Pedidos um por um com os ID de ambos, ficaria feio (por bem nao dizer “horrivel”), mas axo q funcionava.

H

Cabral vo procurar, mas se vc achar algo pronto sobre esse bean composite-id, coloca ai, ja q vc ja passou por tal problema, vlw…

D

Se eu fosse você tinha feito uma classe a mais chamada ItemPedido na qual eu teria um produto e a quantidade de tal produto, assim um pedido teria uma coleção de itemPedido.

Um cliente com uma coleção de pedidos, ou seja, one-to-many.
Um pedido tem uma coleção de itemPedido, ou seja, one-to-many.
Um itemPedido composto de um produto, ou seja, one-to-one.

Acho que isso resolveria o problema. Me corrijam se eu estiver errado.

[]'s

H

diego.r.araujo:
Se eu fosse você tinha feito uma classe a mais chamada ItemPedido na qual eu teria um produto e a quantidade de tal produto, assim um pedido teria uma coleção de itemPedido.

Um cliente com uma coleção de pedidos, ou seja, one-to-many.
Um pedido tem uma coleção de itemPedido, ou seja, one-to-many.
Um itemPedido composto de um produto, ou seja, one-to-one.

Acho que isso resolveria o problema. Me corrijam se eu estiver errado.

[]'s

Pode ser, se nao tiver jeito de fazer como o meu, eu faco a sua modelagem. Mas a modelagem q fiz achei a mais simples e o problema ta na complicacao de mapear p hibernate, pois em banco eu vivo fazendo e vendo esse tipo relacionamento. O teu resolve, so q vai aumentar o numero de tabelas e de codigo tb, mas se eu n conseguir vo fazer assim msm.

H

ALguem teria um “hbm.xml” q mapeasse um relacionamento desse p me ajudar??? Pq no site do Hibernate n tem 1 completo, so tem trechos, e n to acertando…

H

Pessoal, dps de 1 pesquisada fiz os seguintes mapeamentos:

cliente.hbm.xml - nao alterou nada

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<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>
	
</hibernate-mapping>

produto.hbm.xml - tb nao alterou nada

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<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>

</hibernate-mapping>

pedido.hbm.xml - esse sofreu alteracoes

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<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>
	
</hibernate-mapping>

E ainda criei a classe PedidoPK e alterei a classe Pedido

Pedido
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;
    }

}
PedidoPK
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;
    }
    
}

A classe main:

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-[telefone removido]");
        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
    }
    
}
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?

H

Ae ate q enfim consegui, mas falta saber se estou fazendo pelo caminho correto, pela boa prática, eu mudei o main().

package loja;

import java.util.Date;
import java.util.Iterator;
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
        
        Produto produto = new Produto(); //Instanciando um objeto transiente
        produto.setNome("joia");
        produto.setDescricao("joia de diamante");
        produto.setPreco(new Float(100));
        produto.setPromocao('n');
                
        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-[telefone removido]");
        cliente.setData(new Date());
        
        Integer idProduto = (Integer) sessao.save(produto);
        Integer idCliente = (Integer) sessao.save(cliente);
        transaction.commit();
        sessao.close();
                        
        sessao = HibernateUtil.getSession();
        transaction = sessao.beginTransaction();
        
        PedidoPK pedidoPK = new PedidoPK();
        pedidoPK.setFk_cliente(idCliente);
        pedidoPK.setFk_produto(idProduto);
        
        Pedido pedido = new Pedido();
        pedido.setId(pedidoPK);
        pedido.setQuantidade(new Integer(3));
                
        //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
        
        //testando os elementos cadastrados
        sessao = HibernateUtil.getSession();
        transaction = sessao.beginTransaction();
        
        produto = (Produto)sessao.get(Produto.class, idProduto);
        Iterator i = produto.getClientes().iterator();
        
        if (i.hasNext())
            cliente = (Cliente) i.next();
        
        System.out.println("Cliente Id: " + cliente.getId() + " Cliente Nome: " + cliente.getNome());
        
        sessao.close(); //Fechando a sessão
    }

Oq mudou foi o seguinte, p salvar na tabela PEDIDO eu tenho agora 2 caminhos, o primeiro seria adicionar aos SET´s de CLIENTE e PRODUTO usando add() e dps dar upadate neles, mas ai n salvaria a QUANTIDADE. Ja o segundo metodo (o metodo usado e q salva a QUANTIDADE), eh popular o bean PEDIDO e PEDIDOPK e dar save nele. Qnd eu recupero o CLIENTE ou PRODUTO, ele ja vem c os SET´s associados, tanto q fiz um teste la em baixo e pegou blz. Tava dando pau antes pq eu tava tentando salvar pelo 2 modos duma vez so, por isso dava CONSTAINt VIOLATION EXCEPTION. Salvando so pelo BEAN PEDIDO atraves dum save nele pegou legal. Eh isso msm? Esse eh o modo correto? Vlw...

Fica como ajuda se alguem tiver msm problema...

G

como mandei pra vc como msg privada, eu uso uma classe separada para mapear a mapeamento com composite id.

outra coisa, do mapeamento many-to-many com um property na classe de mapeamento, vc deve fazer os set com one-to-many para a classe de associacao, assim como a classe de associacao tem um many-to-one para as outras duas classes.
Tipo esse set com a classe da minha classe contato com a classe instituicao, esse set esta na classe instituicao. Tenta fazer desse jeito.

<set name="contatosInstituicao" inverse="true" cascade="save-update">
        <key column="`codigoInstituicao`"/>
        <one-to-many class="org.cronos.persistencia.bean.ContatoInstituicao"/>  
    </set>
H

rpz eu fiz o seguinte (e pegou), coloquei o na tabela do meio (Pedido) e dentro desta tag eu coloquei .

Eu nao usei <key-many-to-one name="propertyName class=“ClassName” column=“column_name”/>.

Nesse meu caso, eh mais correto usar o “key many to one”? Qual diferenca dele pro “key property”? O “key property” ta pegando td, inclusive a associacao qnd dou um list nas outras tabelas do relacionamento.

Criado 26 de junho de 2007
Ultima resposta 4 de jul. de 2007
Respostas 23
Participantes 7