Problemas com chave composta

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

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

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.

[quote=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.[/quote]

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

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;

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.