Como posso mapear “insert = 'false' update = 'false'” em uma propriedade-chave de ID composta que também é usada em um FK de um para muitos?

Estou trabalhando em uma base de código herdada com um esquema de banco de dados existente. O código existente usa SQL e PL / SQL para executar consultas no banco de dados. Fomos incumbidos de tornar uma pequena parte do mecanismo de banco de dados do projeto independente (a princípio, mude tudo eventualmente). Nós escolhemos usarHibernate 3.3.2.GA e arquivos de mapeamento "* .hbm.xml" (ao contrário de anotações). Infelizmente, não é possível alterar o esquema existente porque não podemos regredir nenhum recurso herdado.

O problema que encontro é quando estou tentando mapear um relacionamento unidirecional e um para muitos onde o FK estáAlém disso parte de uma PK composta. Aqui estão as classes e o arquivo de mapeamento ...

CompanyEntity.java

public class CompanyEntity {
    private Integer id;
    private Set<CompanyNameEntity> names;
    ...
}

CompanyNameEntity.java

public class CompanyNameEntity implements Serializable {
    private Integer id;
    private String languageId;
    private String name;
    ...
}

CompanyNameEntity.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.example">

    <class name="com.example.CompanyEntity" table="COMPANY">
        <id name="id" column="COMPANY_ID"/>
        <set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
            <key column="COMPANY_ID"/>
            <one-to-many entity-name="vendorName"/>
        </set>
    </class>

    <class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
        <composite-id>
            <key-property name="id" column="COMPANY_ID"/>
            <key-property name="languageId" column="LANGUAGE_ID"/>
        </composite-id>
        <property name="name" column="NAME" length="255"/>
    </class>

</hibernate-mapping>

Esse código funciona perfeitamente para SELECT e INSERT de uma empresa com nomes. Encontrei um problema ao tentar atualizar o registro existente. Recebi uma BatchUpdateException e, depois de examinar os logs SQL, vi que o Hibernate estava tentando fazer algoestúpido...

update COMPANY_NAME set COMPANY_ID=null where COMPANY_ID=?

O Hibernate estava tentando desassociar os registros filhos antes de atualizá-los. O problema é que esse campo faz parte do PK e não pode ser anulado. Eu achei que a solução rápida para fazer o Hibernate não fazer isso é adicionar "not-null = 'true'" ao elemento "key" no mapeamento pai. Portanto, agora o mapeamento pode ficar assim ...

CompanyNameEntity.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.example">

    <class name="com.example.CompanyEntity" table="COMPANY">
        <id name="id" column="COMPANY_ID"/>
        <set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
            <key column="COMPANY_ID" not-null="true"/>
            <one-to-many entity-name="vendorName"/>
        </set>
    </class>

    <class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
        <composite-id>
            <key-property name="id" column="COMPANY_ID"/>
            <key-property name="languageId" column="LANGUAGE_ID"/>
        </composite-id>
        <property name="name" column="NAME" length="255"/>
    </class>

</hibernate-mapping>

Esse mapeamento dá a exceção ...

org.hibernate.MappingException: Repeated column in mapping for entity: companyName column: COMPANY_ID (should be mapped with insert="false" update="false")

Meu problema agora é que tentei adicionar esses atributos ao elemento key-property, mas isso não é suportado pelo DTD. Também tentei alterá-lo para um elemento chave de muitos para um, mas também não funcionou. Assim...

Como posso mapear "insert = 'false' update = 'false'" em uma propriedade-chave de ID composta que também é usada em um FK de um para muitos?

questionAnswers(2)

yourAnswerToTheQuestion