質問

オブジェクトを適切にマップできない Spring-Hibernate アプリケーションがあります。基本的に 2 つのドメイン オブジェクトがあります。 Post そして 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 から postUserId から user, ですが、その代わりに結合が間違っています PostId から post (その主キー) UserId から user.

何か案は?ありがとう!

アップデート:以下のいくつかの投稿のおかげで、1 対 1 の代わりに多対 1 のマッピングを使用すべきだったと気づきました。以下のマッピングを変更しました post 以下に:

<many-to-one name="User" class="com...User" column="uId"/>

しかし、今度は、という属性が存在しないことを示す実行時エラーが発生します。 uId. 。私は持っていないので、これは理にかなっています uId 私のコラム post ドメイン オブジェクト (単にドメイン オブジェクトへの参照があるだけです) user 物体)。現在、Hibernate にマッピングする必要があることをどのように認識させることができるかについて非常に混乱しています。 外部キー post テーブルから user テーブルへ。明示的に追加する必要があります uId 私のもの post となるドメインオブジェクト プレースホルダー 外部キーの場合は?

意味が通じているといいのですが...

役に立ちましたか?

解決

ユーザーが多くの記事を持っているので、

は、あなたの団体は、実際には「多対一」ではなく、「1対1」です。あなたはそれに応じてマッピングする場合、それは動作するはずです。

編集:はい、あなたは「1対を持つユーザーで、「一対一多」、またはセットUser.postsとポストのプロパティPost.userをマッピングすることができます」多くの、またはその両方。あなたは、外部キー列の名前を指定したことがありますか?

のEDIT2の:ではHibernateの話す、データベース内「の欄は、」あなたのJavaクラスの「プロパティ」にマッピングされています。つまり、列の属性は、データベース内の自分の外部キー列は、Javaクラスの任意のプロパティのない名前の名前が含まれています。私はあなたの質問の権利を読めば、あなたはいない「UID」、「ユーザーID」を使用する必要があります。

ああ、フェッチ=「参加」それは、ユーザがポストと同じクエリでフェッチされることを義務付けて、怠惰にすることはできません。

他のヒント

1対1のマッピングの動作です。彼らは通常、主キーを共有します。 Hibernateは、ポストの主キーがユーザの主キーとしてTEH同じであると仮定されます。 この動作を要約します。

私は一人のユーザーが実際にかかわらず、複数の柱を持つことができると思われます。それはあなたのマッピング1対多になります。

scroll top