Hibernate e relacionamento

1 resposta
smorigo

Pessoal estou querendo fazer com que o Hibernate me retorne este relacionamento:

select empresa.cd_empresa, 
       empresa.dc_nome_completo,
       empresa.dc_nome_reduzido,
       moeda.dc_moeda
       
  from tb_empresa  empresa,
       tb_moeda    moeda
       
 where empresa.cd_empresa = moeda.cd_empresa
   and empresa.cd_moeda   = moeda.cd_moeda

Para isso eu criei as seguintes classes

public class Empresa implements Serializable {
	private Long codigoEmpresa = null;
	private String razaoSocial = null;
	private String nomeFantasia = null;
	private Moeda moeda = null;

	// metodos get e set
}


public class MoedaPK implements Serializable {
	private Empresa empresa = null;
	private String codigoMoeda = null;

	// metodos get e set
}

public class Moeda implements Serializable {

	private MoedaPK moedaPk = null;
	private String descricaoMoeda = null;

	// metodos get e set
}

Também criei os arquivos de mapeamento no Hiberante

<?xml version="1.0"?>
&lt;!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"&gt;

&lt;hibernate-mapping&gt;
    &lt;class name="br.com.farots.eco.bean.Empresa" table="TB_EMPRESA" &gt;
        &lt;id name="codigoEmpresa" column="CD_EMPRESA" type="java.lang.Long" unsaved-value="0"&gt;
			&lt;generator class="sequence"&gt;
                &lt;param name="sequence"&gt;GE_CODIGO_EMPRESA&lt;/param&gt;
	        &lt;/generator&gt;
        &lt;/id&gt;	
				
		&lt;bag name="moeda" inverse="true" lazy="true" cascade="all"&gt; 
			&lt;key column="CD_MOEDA"/&gt; 
			&lt;one-to-many class="br.com.farots.eco.bean.Moeda"/&gt; 
		&lt;/bag&gt; 	
		
        &lt;property name="razaoSocial"  column="DC_RAZAO_SOCIAL"  type="java.lang.String" /&gt;			  
        &lt;property name="nomeFantasia" column="DC_NOME_FANTASIA" type="java.lang.String" /&gt;		  

    &lt;/class&gt;
&lt;/hibernate-mapping&gt;




<?xml version="1.0"?>
&lt;!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"&gt;

&lt;hibernate-mapping&gt;
    &lt;class name="br.com.farots.eco.bean.Moeda" table="TB_MOEDA" &gt;
		&lt;composite-id name="moedaPk" class="br.com.farots.eco.bean.MoedaPK"&gt; 
			&lt;key-many-to-one name="empresa"  column="CD_EMPRESA"/&gt; 
			&lt;key-property name="codigoMoeda" column="CD_MOEDA" /&gt; 
		&lt;/composite-id&gt; 

        &lt;property name="descricaoMoeda"  column="DC_MOEDA"  type="java.lang.String" /&gt;		  
		
    &lt;/class&gt;
&lt;/hibernate-mapping&gt;

Estou usando DynaAction e eles está definido assim

&lt;form-bean name="empresaForm" type="org.apache.struts.action.DynaActionForm"&gt;
            &lt;form-property name="codigoEmpresa" type="java.lang.Long"/&gt;
            &lt;form-property name="razaoSocial"   type="java.lang.String"/&gt;
            &lt;form-property name="nomeFantasia"  type="java.lang.String"/&gt;
            &lt;form-property name="moeda"         type="java.lang.String"/&gt;			
       &lt;/form-bean&gt;

Pessoal como eu devo mapear esse relacionamento ? eu estou meio q perdido já vi que existe uma tag chamada <bag>, <set>, <one-to-one>…to viajandoooo… rsss alguém pode me ajudar?

valeu pessoal! Feliz Ano Novo!

1 Resposta

legionarioba

Olá amigo…

Vc está utilizando que IDE? Existe um plugin para o Eclipse chamado Hibernate Synchronizer(http://www.binamics.com/hibernatesync) que gera automaticamente os hbm’s, inclusive esse relacionamento… De qualquer forma ai vai um exemplozinho básico:

Num relacionamento entre agência e banco(1 banco para várias agências)

Trecho em Banco.hbm:

&lt;set
		inverse="true"
		lazy="true"
		name="agenciaSet"
	&gt;
		&lt;key column="oid_banco" /&gt;
		&lt;one-to-many class="Agencia" /&gt;
	&lt;/set&gt;

Banco possui uma collection (do tipo set) de agência, neste caso, agenciaSet( que precisa existir em sua classe Banco). A tag <one-to-many> define o relacionamento como sendo de um pra muitos. Cuidado com esse lazy, por padrão o mesmo está habilitado como false, o que habilita que o xml use a reflexão pra varrer todas as correspondentes collections, ou seja…se Banco possui agência, agencia possui endereço, pessoa, empresa, cliente possuírem endereço, todos os arquivos e classes relacionados terão que existir e estar corretamente configurados, caso contrário irão gerar um MappingException se não me engano(Performance baixa, mas garante a integridade dos dados a cada operação). Por outro lado, deixando lazy=true, ele não preencheria a coleção de Agencias…permitindo manipulação apenas do objeto criado para Banco, porém se fosse necessário usar a collection para resgatar dados da agência, ele geraria um LazyInitializationException em sua aplicação, pois não a teria inializado. Neste caso, se resolveradotar essa postura terá que abrir uma nova sessão toda vez que for explorar essa collection.

Trecho em Agencia.hbm:

&lt;many-to-one
		class="Banco"
		name="oidBanco"
		not-null="true"
	&gt;
		&lt;column name="oid_banco" /&gt;
	&lt;/many-to-one&gt;

A tag <many-to-one> define que existem muitas agências para um só banco.

A idéia é a mesma para seu mapeamento…Se pintar alguma dúvida posta ai! Aproveitando a deixa, eu vejo o pessoal falar de colocar a classe como proxy quando se fala em setar lazy=true, alguém tem alguma idéia?

[]'s

Silvio Luiz

Criado 29 de dezembro de 2004
Ultima resposta 29 de dez. de 2004
Respostas 1
Participantes 2