3

ディーラーと売り手の間に 1 対 1 の関係がありますが、これはプロキシを使用するのが面倒です。外部キーが定義されている側 (販売者、販売者を参照) では、これは正常に機能します。しかし、反対側からはうまくいきません - 売り手は常に熱心に積み込まれています. 「遅延読み込みに関するいくつかの説明」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>

両方のクラスが 1 つのテーブルに存在することは問題ですか? 厳密に言えば、関係はデータベースに制約されていません (このモデルを使用することはできません) が、ドメイン モデルには常に両方のエンティティが必要であり、アプリケーションはこれを保証します。

4

2 に答える 2

1

設定を推奨する理由はわかりませんが、リンク先のページが最もよく説明されていると思いますconstrained="true"。データベース レベルで考えると、Hibernate は指定されたプロパティ (ディーラーの売り手) が null であるべきかどうかを、データベースにアクセスしないと判断できません (SELECT ... WHERE OID=:sellerOrDealerId行が返されるかどうかを確認するために a を実行する必要があります)。データベースにアクセスしている間に、残りの行を取得することもできます。アソシエーションの反対側 (売り手のディーラー) からは、行 (したがって列) が既にフェッチされているため、このような問題はありませんSELLER_DEALEROID

私はこれに似たものに一度遭遇し、関連付けを非オプションにすることで解決できました(エラー、null不可)

于 2009-06-11T18:14:05.403 に答える
0

session.get(id) をロードしていると思いますか? HQL クエリを使用してインスタンスをロードしようとしましたか? これにより、どのリレーションシップを熱心にロードするか遅延ロードするかをクエリで指定できます。

HTH

于 2009-05-22T22:45:17.790 に答える