オブジェクトを適切にマップできない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
外部で呼び出されるテーブルがあります。UserId
user
このセットアップは機能するはずだと思いましたが、User
オブジェクトの遅延読み込みを強制するページを読み込むと、次の Hiberate クエリが生成されていることに気付きました。
Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...
明らかにこれは間違っています: UserId
frompost
とUserId
fromを結合する必要がありますが、 from (主キー) とfromをuser
結合するのが間違っています。PostId
post
UserId
user
何か案は?ありがとう!
更新: 以下のいくつかの投稿のおかげで、1 対 1 ではなく多対 1 のマッピングを使用する必要があったことに気付きました。下のマッピングをpost
次のように変更しました。
<many-to-one name="User" class="com...User" column="uId"/>
しかし、 という属性が存在しないという実行時エラーが表示されuId
ます。uId
ドメイン オブジェクトに列がないため、これは理にかなっていpost
ます (単にオブジェクトへの参照があるだけですuser
)。今、ポストテーブルからユーザーテーブルに外部キーをマップする必要があることをHibernateに認識させる方法について、私は本当に混乱しています。ドメイン オブジェクトにuId
属性を明示的に追加して、外部キーのプレースホルダーにする必要がありますか?post
私が理にかなっていることを願っています...