Невозможно выполнить сопоставление один ко многим, используя свойство-ref для альтернативных ключей. - PullRequest
0 голосов
/ 18 мая 2011

У нас проблема с отображением «один ко многим» с помощью свойства ref. Мы получаем ClassCastException, потому что тип столбца property-ref не совпадает с типом PK. Похоже, это известная проблема с поиском в Google. Буду признателен за любую информацию об обходном пути или лучший способ сделать это отображение.

Справочная информация:

  • 3 таблицы Account, User, UserAccount; Отношения один-ко-многим между Пользователем и Аккаунтом
  • Присоединение к таблице UserAccount имеет полный первичный ключ пользователя и часть первичного ключа учетной записи.
  • Отображение один-ко-многим для пользователя с учетной записью пользователя, которая работает, как и ожидалось
  • Атрибут Property-ref для моделирования отношений между UserAccount и Account.
  • Найдена следующая ошибка JIRA, указывающая, что другие люди испытывают ту же проблему с помощью свойства-ref: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2052

Я использую следующие файлы сопоставления.
Счет

<class name="com.model.Account" table="Account">
    <composite-id class="com.model.VersionId"
        mapped="false" name="id">
        <key-property column="entity_id" name="entityId" type="java.lang.Long" />
        <key-property column="entity_vers" name="version" type="java.lang.Long" />
    </composite-id>
    <property column="entity_id" name="entityId"
        type="java.lang.Long" insert="false" update="false" />

    <set name="userAccounts" cascade="none">
        <key column="entity_id" property-ref="entityId"/>
        <many-to-many class="com.model.UserAccount" column="acct_entity_id" property-ref="accountId"/>
    </set>
</class>

Пользователь

<class name="com.model.User" table="User">
    <composite-id class="com.model.VersionId"
        mapped="false" name="id">
        <key-property column="entity_id" name="entityId" type="java.lang.Long" />
        <key-property column="entity_vers" name="version" type="java.lang.Long" />
    </composite-id>
    <property column="user_name" length="255" name="name"
        type="java.lang.String" />

    <set name="userAccounts" table="UserAccount">
        <key>
            <column name="entity_id" />
            <column name="entity_vers" />
        </key>
        <one-to-many class="com.model.UserAccount" />
    </set>

</class>

учетная_запись_пользователь

<class name="com.model.UserAccount"
    table="UserAccount">
      <composite-id class="com.model.UserAccountId"
        mapped="false" name="id">
        <key-property column="entity_id" name="userId" type="java.lang.Long" />
        <key-property column="acct_entity_id" name="accountId"
            type="java.lang.Long" />
        <key-property column="entity_vers" name="userVersion"
            type="java.lang.Long" />
    </composite-id>

    <property column="acct_entity_id" name="accountId"
            type="java.lang.Long" insert="false" update="false"></property>

       <many-to-one name="user"
        class="com.model.User" insert="false"
        update="false">
        <column name="entity_id" />
        <column name="entity_vers" />
    </many-to-one>

    <set name="accounts" cascade="none">
        <key column="acct_entity_id" property-ref="acountId"/>
        <many-to-many class="com.model.Account" column="entity_id" property-ref="entityId"/>
    </set>
</class>

Спасибо

1 Ответ

1 голос
/ 21 мая 2011

Для всех, кому это интересно, я смог решить эту проблему, используя однонаправленное сопоставление «один ко многим» с таблицей соединения между Пользователем и Учетной записью с приведенным ниже отображением на Пользователе для учетных записей

<set name="accounts" table="UserAccounts">
        <key>
            <column name="entity_id" />
            <column name="entity_vers" />
        </key>
        <many-to-many column="acct_entity_id" property-ref="entityId" unique="true" class="com.model.Account" />
    </set>

Я смог успешно это проверить, если в будущем у кого-то возникнет такая проблема при работе с устаревшей базой данных.

Некоторые комментарии: Использование unique = "true" позволяет вам использовать отображение "многие ко многим", где вы должны были бы использовать "один ко многим". Это было важно для меня, так как мне нужно было иметь возможность использовать свойство-ref в отображении с недопустимым в DT-Hibernate.

Ссылка: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/associations.html#assoc-unidirectional-join-12m

...