Associação entre Objetos usando Hibernate

4 respostas
E

Tenho as seguintes tabelas em meu banco de dados:

Mascara (campos: IdMascara, Nome)

Lista (campos: IdLista, Nome)

Usuario (IdUsuario, Nome)

MascaraLista (campos: IdMascaraLista, IdMascara, IdLista)

UsuarioMascaraLista (IdUsuarioMascaraLista, IdUsuario, IdMascaraLista)

Mapeamos essas tabelas no hibernate. O objeto Mascara tem
um set de listas (many-to-many, através da tabela MascaraLista). O ojbeto Lista tem um
set de mascaras.(many-to-many, através da tabela MascaraLista)
O objeto Usuario tem um set de mascaraListas(many-to-many, através da tabela
UsuarioMascaraLista).
Temos também o objeto MascaraLista que tem um set de usuarios(many-to-many, através da
tabela UsuarioMascaraLista).
Quando rodo a aplicação dá o seguinte erro:
INFO: net.sf.hibernate.MappingException: Foreign key (UsuarioMascaraLista
[IdMascaraLista])) must have same number of columns as the reference primary key
(MascaraLista [IdMascara,IdLista])
Eu preciso que o objeto MascaraLista exista por causa de como o ator(usuario) interage
com o sistema.

O que o hibernate está fazendo nessa situação?
Como posso resolver esse problema?

4 Respostas

_fs

Pelo que entendi a tabela MascaraLista possui uma PK composta por duas colunas, IdMascara e IdLista. Ou pelo menos foi isto que mapeou.

Caso seja nada disso, pode postar os mapeamentos?

thiago.quinelato

Trabalho na mesma empresa que a Evelaine e estamos tentando resolver esse problema juntos.
Uso MySQL e, na minha tabela, não há nenhuma PK definida para esses dois campos. Apenas a PK para IdMascaraLista mesmo.

Os mapeamentos estão assim:

Mascara.hbm.xml:
<set
            name="listas"
            table="MascaraLista"
            cascade="save-update"
            lazy="true"
        >
            <key
                column="IdMascara"
            >
            </key>

            <many-to-many
                  class="br.com.valoriza.sitemascara.persistencia.Lista"
                  column="IdLista"
            />
        </set>
Lista.hbm.xml:
<set
            name="mascaras"
            table="MascaraLista"
            cascade="save-update"
            lazy="true"
            inverse="true"
        >
            <key
                column="IdLista"
            >
            </key>

            <many-to-many
                  class="br.com.valoriza.sitemascara.persistencia.Mascara"
                  column="IdMascara"
            />
        </set>
Usuario.hbm.xml:
<set
            name="mascaraListas"
            table="UsuarioMascaraLista"
            cascade="save-update"
        >
            <key
                column="IdUsuario"
            >
            </key>

            <many-to-many
                  class="br.com.valoriza.sitemascara.persistencia.MascaraLista"
                  column="IdMascaraLista"
            />
        </set>
MascaraLista.hbm.xml:
<set
            name="usuarios"
            table="UsuarioMascaraLista"
            cascade="save-update"
            lazy="true"
        >
            <key
                column="IdMascaraLista"
            >
            </key>

            <many-to-many
                  class="br.com.valoriza.sitemascara.persistencia.Usuario"
                  column="IdUsuario"
            />
        </set>

E aí? O que nós fizemos de errado?

_fs

O mapeamento me parece correto caso as PKs estejam declaradas corretamente.

Pelo que o erro me diz entendi que a pk da classe MascaraLista não é o campo IdMascaraLista como esperado, mas sim uma pk-composta por IdMascara e IdLista.

MascaraLista.hbm.xml está com a pk declarada mais ou menos assim?

<id column="IdMascaraLista" name="id" type="java.lang.Integer"> <generator class="identity" /> </id>

thiago.quinelato

A diferença aqui é:
Onde está

<generator class="identity" />

Nós temos

<generator class="native" />

Não altera nada não, altera?

Criado 29 de junho de 2006
Ultima resposta 30 de jun. de 2006
Respostas 4
Participantes 3