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

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

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;   

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

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”.

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

Olá,

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

]['s

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.