Lazy One-to-One с использованием прокси не работает - PullRequest
3 голосов
/ 08 мая 2009

У меня есть отношение один к одному между дилером и продавцом, которое должно быть ленивым при использовании прокси. Для стороны, на которой определен внешний ключ (продавец ссылается на дилера), это работает нормально. Но это не работает с другой стороны - продавец всегда загружен с нетерпением. Я установил constrained="true", как описано в "Некоторые пояснения по отложенной загрузке" , но это не помогло.

Ниже приведено используемое отображение:

<class name="Role" table="PER_PERSROLE" abstract="true">
    <id column="OID" type="long">
        <generator class="native" />
    </id>
    <discriminator column="SUBTYPE" type="string" />
</class>

<subclass name="Dealer" extends="Role" discriminator-value="DEAL">
    <property name="gpNr" column="GP_NR" type="string" />
    <one-to-one name="seller" property-ref="dealer" lazy="proxy" constrained="true"
        outer-join="false" />
</subclass>

<subclass name="Seller" extends="Role" discriminator-value="SELL">
    <many-to-one name="dealer" column="SELLER_DEALEROID" lazy="proxy"
        outer-join="false" />
</subclass>

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

Ответы [ 2 ]

1 голос
/ 11 июня 2009

Я думаю, что страница, на которую вы ссылались, объясняет это лучше, хотя я не уверен, почему она рекомендует установить constrained="true". Если вы думаете об этом на уровне базы данных, Hibernate не может определить, должно ли данное свойство (продавец Дилера) быть нулевым или нет, не обращаясь к базе данных (ему нужно сделать SELECT ... WHERE OID=:sellerOrDealerId, чтобы увидеть, возвращаются ли какие-либо строки) , И пока он попадает в базу данных, он может также извлечь остальную часть строки. С другой стороны ассоциации (дилер продавца) таких проблем нет, поскольку она уже извлекла строку (и, следовательно, столбец SELLER_DEALEROID).

Однажды я столкнулся с чем-то похожим на это и смог решить эту проблему, сделав ассоциацию необязательной (ошибочно, не обнуляемой)

0 голосов
/ 23 мая 2009

Я предполагаю, что вы загружаете session.get (id)? Вы пытались загрузить экземпляр с помощью HQL-запроса? Это позволит вам указать в запросе, какие отношения следует загружать или лениво загружать.

НТН

...