Как я могу сопоставить «insert = 'false' update = 'false'» на свойстве ключа составного идентификатора, которое также используется в FK «один ко многим»?

Я работаю над устаревшей базой кода с существующей схемой БД. Существующий код использует SQL и PL / SQL для выполнения запросов к БД. Нам было поручено сделать небольшую часть проекта независимой от движка СУБД (сначала, со временем все изменить). Мы решили использовать файлы сопоставления Hibernate 3.3.2.GA и «* .hbm.xml» (в отличие от аннотаций). К сожалению, Невозможно изменить существующую схему, потому что мы не можем регрессировать какие-либо унаследованные функции.

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь отобразить однонаправленную связь «один ко многим», где FK также часть композитного ПК. Вот классы и файл сопоставления ...

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>

Этот код отлично работает для SELECT и INSERT компании с именами. Я столкнулся с проблемой при попытке обновить существующую запись. Я получил исключение BatchUpdateException и, просмотрев журналы SQL, увидел, что Hibernate пытается сделать что-то глупое ...

update COMPANY_NAME set COMPANY_ID=null where COMPANY_ID=?

Hibernate пытается разъединить дочерние записи перед их обновлением. Проблема в том, что это поле является частью PK и не допускает значения NULL. Я нашел быстрое решение, чтобы Hibernate не делал этого, - это добавить «not-null = 'true» к элементу «key» в родительском сопоставлении. Итак, теперь сопоставление может выглядеть так ...

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>

Это сопоставление дает исключение ...

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

Моя проблема теперь в том, что я попытался добавить эти атрибуты в элемент ключевого свойства но это не поддерживается DTD. Я также пытался изменить его на элемент типа «ключ многие к одному», но это тоже не сработало. Итак ...

Как я могу сопоставить "insert = 'false' update = 'false'" со свойством ключа составного идентификатора, которое также используется в FK "один ко многим"?

41
задан Jesse Webb 3 February 2011 в 23:23
поделиться