Hibernate ( one-to-many )

4 respostas
C

Salvem,

Tenho duas tabelas, Parceiro e Contato. Parceiro tem um relação de one-to-many com
Contato.
Sendo assim, resolvi definir uma propriedade em Parceiro que seria uma coleção
de Contatos.
Tudo funciona "quase" da forma que deveria. O problema é que, quando o Hibernate vai
carregar a coleção de Contatos, o select que ele executa tem campos repetidos, mais precisamente
os campos que fazem parte da classe ContatoPK.
Como resolver isso, pois assim tenho dados trafegando pela rede sem necessidade, sem contar
que alguns bancos não aceitam isso.
Qualquer palpite tá valendo.

A select fica assim :
SELECT contato.CODCONTATO as CONTATO_, 
           contato.CODPARC as CODPARC_, 
           contato.NOMECONTATO as NOMECONTATO_,
           contato.CODCONTATO as CONTATO, 
           contato.CODPARC as CODPARC from TGFCTT contato where contato.CODPARC = ?
Segue a definição de Parceiro e Contato respectivamente:
Parceiro :
        CODPARC  INT (PK)
        NOMEPARC VARCHAR(30)

        Contato:
        CODCONTATO  INT (PK)
        CODPARC     INT (PK) (FK)
        NOMECONTATO VARCHAR(30)

Ei a definição do hbm.xml para ambas as classes:

<class name="persistence.Parceiro" table="TGFPAR">
        <id name="codigo" column="CODPARC" type="int">
           <generator class="assigned"/>
        </id>
        <property name="nome" column="NOMEPARC" type="string"/>
        <set name="contatos" lazy="false">
           <key column="CODPARC"/>
           <one-to-many class="persistence.Contato"/>
        </set>
     </class>
        <class name="persistence.Contato" table="TGFCTT">
        <composite-id name="pk" class="persistence.ContatoPK">
           <key-property name="codigo"  column="CODCONTATO" type="int"/>
           <key-property name="codParc" column="CODPARC" type="int"/>
        </composite-id>
        <property name="nome" column="NOMECONTATO" type="string"/>
     </class>
A implementação das classes Parceiro e Contato são muito simples:
public class Parceiro implements Serializable{
            private int codigo;
            private String nome;
            private Set contatos;

            /* Getters e Setters*/
        }

        public class Contato implements Serializable{
            private ContatoPK pk;
            private String nome;

            /* Getters e Setters*/
        }

        public class ContatoPK implements Serializable{
            private int codigo;
            private int codParc;

            /* Getters,Setters,hashCode e equals */
        }

4 Respostas

ricardolecheta

bug do hibernate… :wink:

http://forum.hibernate.org/viewtopic.php?t=925623&highlight=compositeid+duplicate

C

Eu já havia visto este post no Hibernate. Mas eu tinha esperança que os brazucas tinham solução para isto. O jeito agora é esperar a solução do Hibernate Team.
Vc sabe de alguma outra forma de mapear one-to-many que não tenha este problema ?
Value pela ajuda.

ricardolecheta

usando composite-id nao tem jeito, com chave simples funciona normalmente

Arcadex

Cara, me desculpe se eu estiver errado, mas olhando essa configuração do HBM do persistence.Parceiro, me parece que houve uma confusão no relacionamento com persistence.Contato !!!

Acredito que seja um relacionamento:

Parceiro: (1) X (N) Contato

Logo, seria um relacionamento many-to-one (de Parceiro p/ Contato) e não um one-to-many como vc fez.

Criado 18 de novembro de 2003
Ultima resposta 13 de abr. de 2005
Respostas 4
Participantes 3