Outra dúvida em Hibernate (outro erro)

2 respostas
javer

Tenho no meu banco em MySQL uma tabela Cliente e uma tabela Vendedor, um cliente pode ter apenas 1 vendedor e um vendedor pode estar em vários clientes.

CREATE TABLE `cliente` ( `id` int(11) NOT NULL AUTO_INCREMENT, `data_cadastro` datetime DEFAULT NULL, `razao_social` varchar(50) DEFAULT NULL, `nome_fantasia` varchar(50) DEFAULT NULL, `cnpj` varchar(18) NOT NULL, `incricao_estadual` varchar(18) DEFAULT NULL, `telefone` varchar(15) DEFAULT NULL, `fax` varchar(15) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `nome_contato` varchar(50) DEFAULT NULL, `vendedor` int(11) DEFAULT NULL, `desconto_sobre_frete` decimal(12,2) DEFAULT NULL, `valor_minimo_frete` decimal(10,2) DEFAULT NULL, `pagina_guia_ruas` smallint(6) DEFAULT NULL, `empresa` int(11) DEFAULT NULL, `nome_pais` varchar(50) DEFAULT 'Brasil', `sigla_pais` varchar(2) DEFAULT 'BR', `tipo` smallint(2) DEFAULT '1', `status` smallint(2) DEFAULT '1', `endereco_internet` varchar(120) DEFAULT NULL, `observacao` text, PRIMARY KEY (`cnpj`), UNIQUE KEY `id` (`id`), KEY `FK_cliente` (`empresa`), KEY `FK_cliente_vendedor` (`vendedor`), CONSTRAINT `FK_cliente` FOREIGN KEY (`empresa`) REFERENCES `empresa` (`id`) ON DELETE CASCADE, CONSTRAINT `FK_cliente_vendedor` FOREIGN KEY (`vendedor`) REFERENCES `vendedor` (`id`) )

CREATE TABLE `vendedor` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(50) DEFAULT NULL, `cpf` varchar(18) NOT NULL, `identidade` varchar(18) DEFAULT NULL, `percentual_comissao` decimal(3,2) DEFAULT '5.00', `status` smallint(2) DEFAULT '1', `observacao` text, `telefone` varchar(15) DEFAULT NULL, `celular` varchar(15) DEFAULT NULL, `email` varchar(120) DEFAULT NULL, PRIMARY KEY (`cpf`), UNIQUE KEY `id` (`id`) )

Mapeamentos:
Cliente

<hibernate-mapping> <class name="org.transporter.sys.pojos.Cliente" table="cliente" lazy="false" catalog="transport"> <id name="cnpj" type="string"> <column name="cnpj" length="18" /> <generator class="identity" /> </id> <many-to-one name="vendedor" class="org.transporter.sys.pojos.Vendedor" fetch="select"> <column name="vendedor" length="18" /> </many-to-one> <many-to-one name="empresa" class="org.transporter.sys.pojos.Empresa" fetch="select"> <column name="empresa" length="10" /> </many-to-one> <property name="id" type="int"> <column name="id" not-null="true" unique="true" /> </property> <property name="dataCadastro" type="timestamp"> <column name="data_cadastro" length="19" /> </property> <property name="razaoSocial" type="string"> <column name="razao_social" length="50" /> </property> <property name="nomeFantasia" type="string"> <column name="nome_fantasia" length="50" /> </property> <property name="incricaoEstadual" type="string"> <column name="incricao_estadual" length="18" /> </property> <property name="telefone" type="string"> <column name="telefone" length="15" /> </property> <property name="fax" type="string"> <column name="fax" length="15" /> </property> <property name="email" type="string"> <column name="email" length="50" /> </property> <property name="nomeContato" type="string"> <column name="nome_contato" length="50" /> </property> <property name="descontoSobreFrete" type="big_decimal"> <column name="desconto_sobre_frete" precision="12" /> </property> <property name="valorMinimoFrete" type="big_decimal"> <column name="valor_minimo_frete" precision="10" /> </property> <property name="paginaGuiaRuas" type="java.lang.Short"> <column name="pagina_guia_ruas" /> </property> <property name="nomePais" type="string"> <column name="nome_pais" length="50" /> </property> <property name="siglaPais" type="string"> <column name="sigla_pais" length="2" /> </property> <property name="tipo" type="java.lang.Short"> <column name="tipo" /> </property> <property name="status" type="java.lang.Short"> <column name="status" /> </property> <property name="enderecoInternet" type="string"> <column name="endereco_internet" length="120" /> </property> <property name="observacao" type="string"> <column name="observacao" length="65535" /> </property> </class> </hibernate-mapping>

Vendedor

<hibernate-mapping> <class name="org.transporter.sys.pojos.Vendedor" table="vendedor" lazy="false" catalog="transport"> <id name="cpf" type="string"> <column name="cpf" length="18" /> <generator class="identity" /> </id> <property name="id" type="int"> <column name="id" not-null="true" unique="true" /> </property> <property name="nome" type="string"> <column name="nome" length="50" /> </property> <property name="identidade" type="string"> <column name="identidade" length="18" /> </property> <property name="percentualComissao" type="big_decimal"> <column name="percentual_comissao" precision="3" /> </property> <property name="status" type="java.lang.Short"> <column name="status" /> </property> <property name="observacao" type="string"> <column name="observacao" length="65535" /> </property> <property name="telefone" type="string"> <column name="telefone" length="15" /> </property> <property name="celular" type="string"> <column name="celular" length="15" /> </property> <property name="email" type="string"> <column name="email" length="120" /> </property> <set name="clientes" inverse="true"> <key> <column name="vendedor" length="18" /> </key> <one-to-many class="org.transporter.sys.pojos.Cliente" /> </set> </class> </hibernate-mapping>

Na tabela cliente tem uma única linha com o código 1 na coluna vendedor, na tabela vendedor tem uma única linha com a id 1, ou seja, a associação é válida.
Porém quando faço uma consulta para listar TUDO em cliente, dá essa exceção:
No row with the given identifier exists: [org.transporter.sys.pojos.Vendedor#1]
Mas existe a linha com a id 1 na tabela Vendedor.

Criteria criteria = session.createCriteria(Cliente.class).addOrder(Order.asc("razaoSocial"));

Certamente estou fazendo alguma coisa errada ou entendi errado alguma coisa nesses relacionamentos do Hibernate, alguém com experiência poderia me apontar o que há de errado?

Agradeço

2 Respostas

ignacio83
<id name="cpf" type="string">   
   <column name="cpf" length="18" />   
   <generator class="identity" />   
</id>

Neste trecho vc esta falando que a chave primária de sua tabela é o CPF, pelo que eu vi no script de criação a sua chave primária não é CPF e sim ID.

O que o hibernate está reclamando é que existem muitos CPFs com o mesmo valor.

Vc está confundido a coluna ID com a tag ID.

javer

Obrigado, eu havia mesmo feita uma confusão, agora está resolvido.

Criado 27 de abril de 2009
Ultima resposta 28 de abr. de 2009
Respostas 2
Participantes 2