Hibernate e PK composta

4 respostas
A

Pessoal tenho uma duvida, tenho duas classes Empresa e Moeda criei dois JavaBean:

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 Moeda implements Serializable {

	private Empresa empresa = null;
	private String codigoMoeda = null;
	private String descricaoMoeda = null;

                // Metodos Get e Set
}

Agora minha duvida é na criação do mapeamento do Hibernate, como devo proceder ?

Minhas tabelas são:

TB_EMPRESA (
CD_EMPRESA INTEGER NOT NULL,
DC_RAZAO_SOCIAL VARCHAR(60) NOT NULL,
DC_NOME_FANTASIA VARCHAR(40) NOT NULL,
CD_MOEDA INTEGER,
PRIMARY KEY(CD_EMPRESA))

TB_MOEDA (
CD_EMPRESA INTEGER NOT NULL,
CD_MOEDA VARCHAR(3) NOT NULL,
DC_MOEDA VARCHAR(60) NOT NULL,
PRIMARY KEY (CD_EMPRESA, CD_MOEDA))

Na tabela TB_MOEDA tenho uma FK ligando a CD_EMPRESA.TB_MOEDA com a CD_EMPRESA.TB_EMPRESA…

Agora estou criando os arquivos de mapeamento:

XML da tabela TB_EMPRESA

<?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.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;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 da tabela TB_MOEDA

<?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.bean.Moeda" table="TB_MOEDA" &gt;
		&lt;composite-id name="id" class="br.com.farots.eco.bean.Moeda"&gt; 
			&lt;key-many-to-one name="empresa"     column="CD_EMPRESA"  /&gt; 
			&lt;key-many-to-one name="codigoMoeda" column="CD_MOEDA" /&gt; 
		&lt;/composite-id&gt; 

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

Ja li em alguns locais sobre criar uma classe com os campos que compoem a chave… mais nao consegui entender o pq e se devo fazer isso mesmo…

valeu

4 Respostas

F

Criamos uma classe para referenciar a PK para facilitar o trabalho.

Afinal, como vc faria um load utilizando a criteria por exemplo sem uma classe que representa-se a PK :) ?

Criteria criteria = session.creteCriteria( Moeda.class );
criteria.load( moedaPk );

O mapeamento deve ser o seguinte:

Empresa
&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.bean.Empresa" table="TB_EMPRESA" &gt;
        &lt;id name="codigo" 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;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;
Moeda
&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.bean.Moeda" table="TB_MOEDA" &gt;
		&lt;composite-id name="id" class="br.com.bean.MoedaPK"&gt; 
			&lt;key-many-to-one name="empresa"     column="CD_EMPRESA"  /&gt; 
			&lt;key-many-to-one name="codigo" column="CD_MOEDA" /&gt; 
		&lt;/composite-id&gt; 

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

As classes devem ficar assim:

Class Moeda {
   private MoedaPK moedaPk;
   private String descricao;
}

Class MoedaPK {
   private Empresa empresa;
   private Long codigo;
}

Class Empresa {
   private Long codigo;
   private String razaoSocial;
   private String nomeFantasia;
}
smorigo

Bom eu fiz a alteração mais agora estou recebendo uma mensagem de erro quando ele tenta carregar o arquivo de mapeamento da tabela que possui a PK composta.

javax.servlet.ServletException: net.sf.hibernate.MappingException: Error reading resource: br/com/farots/eco/bean/Moeda.hbm.xml

Minhas classes ficaram assim:

public class Empresa implements Serializable {
	private Long codigoEmpresa = null;
	private String razaoSocial = null;
	private String nomeFantasia = null;
                 
                // metodos get e set...
}


public class Moeda implements Serializable {

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

                // metodos get e set...
}


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

                // metodos get e set...
}

Também alterei meu arquivo de mapeamento, acredito que esteja nele o problema…

<?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.bean.Moeda" table="TB_MOEDA" &gt;
		&lt;composite-id name="id" class="br.com.bean.MoedaPK"&gt; 
			&lt;key-many-to-one name="empresa"     column="CD_EMPRESA"  /&gt; 
			&lt;key-many-to-one 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;

Valeu pessoal!

F

Tente conferir seu hibernate.cfg.xml. Lá vc deve apontar corretamente o caminho de seu arquivo xxx.hbm.xml

Ex.:
Se seu mapeamento Moeda.hbm.xml está no mesmo pacote de sua classe Moeda vc deve referir-se da seguinte forma:

br/com/bean/Moeda.hbm.xml

Observe:

&lt;class name="br.com.bean.Moeda" table="TB_MOEDA" &gt;

br/com/farots/eco/bean/Moeda.hbm.xml

flw

T

OPa e ai funcionou ?

vi esta dúvida estou na mesma situação não to conseguindo dominar o esquema de chaves compostas com hibernate…

preciso fazer um mapeamento( arquivo .hml.xml ) para a classe pk ?

se sim como fica ?

Criado 23 de dezembro de 2004
Ultima resposta 15 de set. de 2008
Respostas 4
Participantes 4