2

オブジェクトを適切にマップできない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 ...

明らかにこれは間違っています: UserIdfrompostUserIdfromを結合する必要がありますが、 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

私が理にかなっていることを願っています...

4

2 に答える 2

1

ユーザーは多くの投稿を持っているため、関連付けは実際には「1 対 1」ではなく「多対 1」です。それに応じてマッピングすればうまくいくはずです。

編集: はい、Post のプロパティ Post.user を「多対 1」でマップするか、User のセット User.posts を「1 対多」でマップするか、またはその両方を使用できます。外部キー列の名前を指定しましたか?

Edit2 : Hibernate で言えば、データベースの「列」は Java クラスの「プロパティ」にマップされます。つまり、列属性には、Java クラスのプロパティの名前ではなく、データベースの外部キー列の名前が含まれます。あなたの質問を正しく読んだら、「uId」ではなく「UserId」を使用する必要があります。

ああ、そして fetch="join" は、ユーザーが投稿と同じクエリでフェッチされることを義務付けているため、遅延することはできません。

于 2010-03-25T00:04:38.527 に答える
0

これが 1 対 1 マッピングの動作です。通常、これらは主キーを共有します。Hibernate は、post の主キーが user の主キーと同じであると想定しています。このページでは、この動作をまとめています。

ただし、1 人のユーザーが実際には複数の投稿を持つことができると思います。これにより、マッピングが 1 対多になります。

于 2010-03-25T00:06:14.150 に答える