Spring-Hibernate マッピングの問題
-
22-09-2019 - |
質問
オブジェクトを適切にマップできない 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
から post
と UserId
から 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対多になります。