Problemas com chave composta

5 respostas
gabrielmelo

Salve,

Pessoal, alguem pode me dar um luz :idea: ? Estou tendo problemas com um mapeamento de uma tabela com chave composta, exemplo:
OBS: estou usando XDoclet.

Substancia.java

public class Substancia {

    /**
     * @hibernate.id column="ID_SUBSTANCIA" generator-class="assigned"
     */
    private Long id;
    //Métodos getter e setter
}

Laboratorio.java

public class Laboratorio{

    /**
     * @hibernate.id column="ID_LABORATORIO" generator-class="assigned"
     */
    private Long id;
    //Métodos getter e setter

}

SubstanciaLaboratorio.java, essa classe é o relacionamento de Substancia com a de Laboratorio

public class SubstanciaLaboratorio{

     private SubstanciaLaboratorioID id;
     //Métodos getter e setter 

}

SubstanciaLaboratorioID.java

public class SubstanciaLaboratorioID {

    private Substancia substancia;
    private Laboratorio laboratorio;
    //Métodos getter e setter

}

Todas as vezes que vou gerar o ant hibernate, da erro e trunca o arquivo SubstanciaLaboratorio.hbm.xml.

<hibernate-mapping auto-import="false">
    <class
        name="br.gov.mapa.sipa.model.SubstanciaLaboratorio"
        table="S_SUBSTANCIA_LABORATORIO"
        schema="SIPA"
        dynamic-update="false"
        dynamic-insert="false"
        lazy="true"
    >    
    
    <composite-id
            name="id"
            class="br.gov.mapa.sipa.model.SubstanciaLaboratorioID">
        
        <key-many-to-one name="substancia" column="ID_SUBSTANCIA" class="br.gov.mapa.sipa.model.Substancia"/>
        <key-many-to-one name="laboratorio" column="ID_LABORATORIO" class="br.gov.mapa.sipa.model.Laboratorio"/>    
    
    </composite-id>

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-SubstanciaLaboratorio.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

</hibernate-mapping>

As outras classe do meu projeto que fica abaixo de SubstanciaLaboratorio.hbm.xml não são gerados os seus respctivos blablabla.hbm.xml, por esse erro do SubstanciaLaboratorio.hbm.xml

Obrigado,
Gabriel

5 Respostas

cv1

Se tem qualquer coisa que vc possa fazer pra evitar usar chaves compostas, ta na hora :slight_smile:

http://codebetter.com/blogs/jeremy.miller/archive/2007/02/01/Composite-keys-are-evil.aspx

gabrielmelo

O erro gerado:

[hibernatedoclet] (XDocletMain.start 53 ) A execução do XDoclet falhou.
[hibernatedoclet] (XDocletMain.start 54 ) <<A propriedade ID está faltando na classe br.gov.mapa.sipa.model.SubstanciaLaboratorio>>
[hibernatedoclet] C:\ProjetoMAPA\Desenvolvimento\SIPA\Model\build.xml:56: O XDoclet falhou.

mister_m

gabrielmelo:
O erro gerado:

[hibernatedoclet] (XDocletMain.start 53 ) A execução do XDoclet falhou.
[hibernatedoclet] (XDocletMain.start 54 ) &lt<A propriedade ID está faltando na classe br.gov.mapa.sipa.model.SubstanciaLaboratorio>&gt
[hibernatedoclet] C:\ProjetoMAPA\Desenvolvimento\SIPA\Model\build.xml:56: O XDoclet falhou.

Você precisa colocar @hibernate.id na propriedade. Mas fuja de chaves compostas que é melhor :slight_smile:

gabrielmelo

mister_m,

Eu queria correr mesmo de chave composto, o modelo foi construido assim, agora tenho que quebrar a cabeça, por mim eu não usaria.

A propriedade do mapeamento do hibernate ta certo, como no ex., abaixo ?

/**
 * @hibernate.class table="S_SUBSTANCIA_LABORATORIO" schema="SIPA"
 */
public class SubstanciaLaboratorio {

    /**
     * @hibernate.id class="SubstanciaLaboratorioID" 
     */    
    private SubstanciaLaboratorioID id;

Agora essa tabela abaixo não esta no modelo, só criei ela para eu resolver esse problema de chave composta. E o mapemento das colunas esta certo ?

/**
 * @hibernate.class table="SubstanciaLaboratorioID" schema="NÃO ESTA NO MODELO"
 */
public class SubstanciaLaboratorioID {
    
    /**
     * @hibernate.id column="Substancia" 
     */
    private Substancia substancia;
    
    /**
     * @hibernate.id column="Laboratorio" 
     */    
    private Laboratorio laboratorio;
gabrielmelo

Resolvi,

Pesquisei no proprio forum do guj, não existe um hibernatexdoclet especifico para mapeamento de chave composta. Gerei o hbm.xml da chave composta na mão mesmo, com isso, acabei com o meu problema.

Valew a todos pela ajuda.

Criado 2 de julho de 2007
Ultima resposta 3 de jul. de 2007
Respostas 5
Participantes 3