Hibernate - associação many-to-one não gravada no banco

5 respostas
C

Pessoal,

Eu estou enfrentando um problema ao incluir ou atualizar um objeto Exame. Segue abaixo o HBM:

Exame.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    
<hibernate-mapping>
<!-- 
    Created by the Middlegen Hibernate plugin 2.2

    http://boss.bekk.no/boss/middlegen/
    http://www.hibernate.org/
-->

<class 
    name="Exame" 
    table="exame"
>

    <composite-id name="comp_id" class="ExamePK">
        <key-property 
            name="cdUnidade" 
            column="cd_unidade" 
            type="java.lang.Integer"
            length="4"
        />
        <key-property 
            name="cdExame" 
            column="cd_exame" 
            type="java.lang.Integer"
            length="4"
        />
    </composite-id>    

    <many-to-one
        name="paciente"
        class="Paciente"
        not-null="true"
        update="false"
	insert="false"
    >
        <column name="cd_paciente" />
        <column name="cd_unidade" />
    </many-to-one>

</class>
</hibernate-mapping>

O problema é que a associação com paciente não é persistida, devido ao update="false insert=“false”. Porém caso não existir essa configuração, ocorre o erro de mapeamento “org.hibernate.MappingException: Repeated column in mapping for entity: Exame column: cd_unidade (should be mapped with insert=“false” update=“false”)”.

Ou seja, exame tem como pk(cd_exame e cd_unidade) e paciente pk(cd_paciente e cd_unidade). Mas é necessário persistir a referência ao paciente ao incluir ou atualizar o exame.

Alguma idéia?

[]'s

5 Respostas

rodrigo_gomes

Olá,

tente colocar a referencia as duas keys do Paciente na key do exame (e modifique a ExamePK conforme necessário)

&lt;composite-id name="comp_id" class="ExamePK"&gt;
         &lt;key-many-to-one name="cdUnidade" column="cd_unidade" 
            class="Paciente" /&gt;
        &lt;key-many-to-one name="cdPaciente" column="cd_paciente" 
            class="Paciente" /&gt;
         &lt;key-property name="cdExame" column="cd_exame" 
             type="java.lang.Integer" length="4" /&gt;

&lt;/composite-id&gt;
F

Olá,

Eu acho que o teu problema é de logica.
Tu tem um objeto Paciente que tem um relacionamento com Exame, provavelmente um one-to-many. E ao mesmo tempo tu tem um relacionamento many-to-one do Exame para o Paciente, por isso o hibernate obriga o update="false e o insert=“false” em um dos dois relacionamentos, tu precisa ter um unico relacionamento de atualizacao digamos assim.

Bom por que eu digo que tem problema de logica, se o que eu falei acima ta correto o que tu ta tentando fazer é adionar um Exame a um Paciente entao o correto seria tu buscar o Paciente e depois adicionar o Exame nele e apos isso persistir.

]['s

C

Fábio,
Na verdade eu precisaria persistir das 2 formas, ou seja, inserir o exame associando o paciente e também inserir o paciente associando os exames.
Esse problema apareceu após eu incluir o cd_unidade no PK do exame e do paciente, pois antes disso eu conseguia persistir das 2 formas, sem a necessidade do update=“false” insert=“false”.

F

cris_rufino:
Fábio,
Na verdade eu precisaria persistir das 2 formas, ou seja, inserir o exame associando o paciente e também inserir o paciente associando os exames.
Esse problema apareceu após eu incluir o cd_unidade no PK do exame e do paciente, pois antes disso eu conseguia persistir das 2 formas, sem a necessidade do update=“false” insert=“false”.

Olá,

Eu acho meio estranho fazer isso, mas se precisa mesmo acho que a solucao do Rodrigo da jeito no problema.

]['s

C

Sim tbém acho, a solução do Rodrigo poderia resolver esse caso. Mas o problema é que em “Exame” há outras associações iguais, além de paciente.
Então na verdade essa solução no meu caso não resolveria, pois eu teria que colocar no ExamePK todas essas associações.

Criado 7 de setembro de 2006
Ultima resposta 8 de set. de 2006
Respostas 5
Participantes 3