Dúvida mapeamento Hibernate

5 respostas
C

Olá Gujeiros, comecei a aprender Hibernate, estou tentando mapear uma tabela que possui uma chave primária concatenada com duas chaves estrangeiras, até o momento não encontrei a forma correta de mapear esta chave primária concatenada. Adicionei também uma imagem com a modelagem das tabelas. Segue o mapeamento que tentei fazer até o momento:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="br.bmweb.pojo">
	<class name="Venda" table="TB_VENDA">
		<id name="cod_funcionario" column="VE_COD_FUNCIONARIO">
			<generator class="foreign">
				<param name="property">TB_FUNCIONARIO</param>
			</generator>
		</id>

		<id name="cod_orcamento" column="VE_COD_ORCAMENTO">
			<generator class="foreign">
				<param name="property">TB_ORCAMENTO</param>
			</generator>
		</id>

		<id name="cod_cliente" column="VE_COD_CLIENTE">
			<generator class="foreign">
				<param name="property">TB_CLIENTE</param>
			</generator>
		</id>

		<property name="data_venda" type="java.lang.Date">
			<column name="VE_DATA_VENDA" />
		</property>
		<property name="data_fechamento" type="java.lang.Date">
			<column name="VE_DATA_FECHAMENTO" />
		</property>
		<property name="status_venda" type="java.lang.String">
			<column length="10" name="VE_STATUS_VENDA" />
		</property>
		<property name="valor_unitario" type="java.lang.Double">
			<column name="VE_VALOR_UNIT" />
		</property>
		<property name="valor_total" type="java.lang.DOUBLE">
			<column name="VE_VALOR_TOTAL" />
		</property>
		<property name="valor_desconto" type="java.lang.DOUBLE">
			<column name="VE_VALOR_DESCONTO" />
		</property>
		<property name="tipo_venda" type="java.lang.String">
			<column length="10" name="VE_TIPO_VENDA" />
		</property>
		<property name="tipo_pagamento" type="java.lang.String">
			<column length="10" name="VE_TIPO_PAGAMENTO" />
		</property>

		<many-to-one name="orcamento" class="br.bmweb.pojo.Orcamento" column="VE_COD_ORCAMENTO" not-null="true"/>
		<many-to-one name="cliente" class="br.bmweb.pojo.Cliente" column="VE_COD_CLIENTE" not-null="true"/>
		<many-to-one name="funcionario" class="br.bmweb.pojo.Funcionario" column="VE_COD_FUNCIONARIO" not-null="true"/>
	</class>
</hibernate-mapping>

Link com a imagem da modelagem das tabelas:
[url]http://img200.imageshack.us/img200/7094/23350719.png[/url]

Alguém sabe como fazer o mapeamento correto?

5 Respostas

LPJava

cara, posso dar uma sugestao?

Quando eu comecei a estudar hibernate e como fazer esses mapeamento, eu fui fazendo exemplo bem simples, com pouco mapeamentos e no inicio nao envolvia tantas tabelas, isso para entender a estrutura de como o hibernate trabalhar com os relacionamentos e poder praticar e quando tivesse erros eu poderia descobrir mais rapidamente pq o relacionamento era pequeno. Quando se tem mais codes, mais relaciomanetos, dificulta na hora de encontrar o erro, as vezes nem eh no mapeamento. Como por exemplo, se vc estiver usando mysql 5, vc precisa manualmente criar os indexes para as colunas que serao FKs, caso contrario nao vai conseguir fazer o relacionamento, isso eh uma particularidade do mysql com indexes. E ele dar um erro louco ao tentar criar os fks sem os indices. E na epoca eu conseguia tratar os erros, pq tinha um relacionamento one-to-many etc. bem simples. mas, fica ai a dica.

Observe meu mapeamento e compare com o seu:

<hibernate-mapping>
    <class name="br.com.bean.Advert"  table="advert">
        <id name="id" type="int" column="id">
            
            <generator class="native" />
        </id>
        <property name="title" type="string" column="title" />
            
       
        <property name="message" type="string" column="message" />
        
       
        <many-to-one name="user" class="br.com.bean.User" 
        column="aduser" not-null="true" foreign-key="FK_advert_user"/>
       
    </class>
</hibernate-mapping>

Tem um livro bem legal para dar os primeiros passos com hibernate veja.

flw!

C

Dei uma modificada e deixei desta forma:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="br.bmweb.pojo">
	<class name="Venda" table="TB_VENDA">
		
		<property name="data_venda" type="java.lang.Date" not-null="true">
			<column name="VE_DATA_VENDA" />
		</property>
		<property name="data_fechamento" type="java.lang.Date" not-null="true">
			<column name="VE_DATA_FECHAMENTO" />
		</property>
		<property name="status_venda" type="java.lang.String" not-null="true">
			<column length="10" name="VE_STATUS_VENDA" />
		</property>
		<property name="valor_unitario" type="java.lang.Double" not-null="true">
			<column name="VE_VALOR_UNIT" />
		</property>
		<property name="valor_total" type="java.lang.DOUBLE" not-null="true">
			<column name="VE_VALOR_TOTAL" />
		</property>
		<property name="valor_desconto" type="java.lang.DOUBLE" not-null="true">
			<column name="VE_VALOR_DESCONTO" />
		</property>
		<property name="tipo_venda" type="java.lang.String" not-null="true">
			<column length="10" name="VE_TIPO_VENDA" />
		</property>
		<property name="tipo_pagamento" type="java.lang.String" not-null="true">
			<column length="10" name="VE_TIPO_PAGAMENTO" />
		</property>

		<many-to-one name="orcamento" class="br.bmweb.pojo.Orcamento" column="VE_COD_ORCAMENTO" not-null="true" foreign-key="TB_VENDA_FKIndex1"/>
		<many-to-one name="cliente" class="br.bmweb.pojo.Cliente" column="VE_COD_CLIENTE" not-null="true" foreign-key="TB_VENDA_FKIndex1"/>
		<many-to-one name="funcionario" class="br.bmweb.pojo.Funcionario" column="VE_COD_FUNCIONARIO" not-null="true" foreign-key="TB_VENDA_FKIndex1"/>
	</class>
</hibernate-mapping>

Mas logo na tag ocorre o erro abaixo:

The content of element type "class" must match "(meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-id),discriminator?,natural-id?,(version|timestamp)?,(property|many-to-one|one-to-
 one|component|dynamic-component|properties|any|map|set|list|bag|idbag|array|primitive-array)*,((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-insert?,sql-update?,sql-delete?,filter*,resultset*,
 (query|sql-query)*)".
LPJava

so uma duvida vc está usando que BD? vc está certo que tem aquele valor para FK?

C

Estou usando MySQL 5, na realidade aparece como um índice. A estrutura de criação da tabela tá assim:

CREATE TABLE 'tb_venda' ( 'VE_COD_FUNCIONARIO' int(10) unsigned NOT NULL, 'VE_COD_CLIENTE' int(10) unsigned NOT NULL, 'VE_COD_ORCAMENTO' int(10) unsigned NOT NULL, 'VE_DATA_VENDA' date NOT NULL, 'VE_DATA_FECHAMENTO' date NOT NULL, 'VE_STATUS_VENDA' varchar(10) NOT NULL, 'VE_VALOR_UNIT' double NOT NULL, 'VE_VALOR_TOTAL' double NOT NULL, 'VE_DESCONTO' double NOT NULL, 'VE_TIPO_VENDA' varchar(10) NOT NULL, 'VE_TIPO_PAGAMENTO' varchar(10) NOT NULL, PRIMARY KEY ('VE_COD_FUNCIONARIO','VE_COD_CLIENTE','VE_COD_ORCAMENTO') USING BTREE, KEY 'TB_VENDA_FKIndex1' ('VE_COD_ORCAMENTO','VE_COD_CLIENTE','VE_COD_FUNCIONARIO') ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

C

Estou usando MySQL 5, na realidade aparece como um índice. A estrutura de criação da tabela tá assim:

CREATE TABLE 'tb_venda' ( 'VE_COD_FUNCIONARIO' int(10) unsigned NOT NULL, 'VE_COD_CLIENTE' int(10) unsigned NOT NULL, 'VE_COD_ORCAMENTO' int(10) unsigned NOT NULL, 'VE_DATA_VENDA' date NOT NULL, 'VE_DATA_FECHAMENTO' date NOT NULL, 'VE_STATUS_VENDA' varchar(10) NOT NULL, 'VE_VALOR_UNIT' double NOT NULL, 'VE_VALOR_TOTAL' double NOT NULL, 'VE_DESCONTO' double NOT NULL, 'VE_TIPO_VENDA' varchar(10) NOT NULL, 'VE_TIPO_PAGAMENTO' varchar(10) NOT NULL, PRIMARY KEY ('VE_COD_FUNCIONARIO','VE_COD_CLIENTE','VE_COD_ORCAMENTO') USING BTREE, KEY 'TB_VENDA_FKIndex1' ('VE_COD_ORCAMENTO','VE_COD_CLIENTE','VE_COD_FUNCIONARIO') ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Alguém tem idéia de como mapear corretamente?

Criado 14 de março de 2010
Ultima resposta 14 de mar. de 2010
Respostas 5
Participantes 2