オブジェクトを適切にマップできないSpring-Hibernateアプリケーションがあります。基本的に、aPostとaの2つのドメインオブジェクトがありUserます。セマンティクスは、すべての投稿に対応するユーザーが 1 人いるというものです。
ドメイン オブジェクトは、おおよそ次のPostようになります。
class Post {
private int pId;
private String attribute;
...
private User user;
//getters and setters here
}
ご覧のとおりPost、 への参照が含まれていますUser。オブジェクトをロードするPostとき、対応するUserオブジェクトをロードしたい(遅延 - 必要な場合のみ)。
私のマッピングは次のようになります。
<class name="com...Post" table="post">
<id name="pId" column="PostId" />
<property name="attribute" column="Attribute" type="java.lang.String" />
<one-to-one name="User" fetch="join"
class="com...User"></one-to-one>
</class>
そしてもちろん、Userセットアップ用の基本的なマッピングがあります。
私のテーブルスキーマに関する限り、テーブルにリンクするpost外部で呼び出されるテーブルがあります。UserIduser
このセットアップは機能するはずだと思いましたが、Userオブジェクトの遅延読み込みを強制するページを読み込むと、次の Hiberate クエリが生成されていることに気付きました。
Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...
明らかにこれは間違っています: UserIdfrompostとUserIdfromを結合する必要がありますが、 from (主キー) とfromをuser結合するのが間違っています。PostIdpostUserIduser
何か案は?ありがとう!
更新: 以下のいくつかの投稿のおかげで、1 対 1 ではなく多対 1 のマッピングを使用する必要があったことに気付きました。下のマッピングをpost次のように変更しました。
<many-to-one name="User" class="com...User" column="uId"/>
しかし、 という属性が存在しないという実行時エラーが表示されuIdます。uIdドメイン オブジェクトに列がないため、これは理にかなっていpostます (単にオブジェクトへの参照があるだけですuser)。今、ポストテーブルからユーザーテーブルに外部キーをマップする必要があることをHibernateに認識させる方法について、私は本当に混乱しています。ドメイン オブジェクトにuId属性を明示的に追加して、外部キーのプレースホルダーにする必要がありますか?post
私が理にかなっていることを願っています...