[解決済み] JPAとHibernateのアソシエーションの一方向と双方向の違いは何ですか?
質問
一方向関連付けと双方向関連付けの違いは何ですか?
dbに生成されたテーブルはすべて同じなので、私が見つけた唯一の違いは、双方向の関連付けの各側が他方を参照し、一方向の関連付けは参照しないことです。
これは単方向アソシエーションです
public class User {
private int id;
private String name;
@ManyToOne
@JoinColumn(
name = "groupId")
private Group group;
}
public class Group {
private int id;
private String name;
}
双方向の関連付け
public class User {
private int id;
private String name;
@ManyToOne
@JoinColumn(
name = "groupId")
private Group group;
}
public class Group {
private int id;
private String name;
@OneToMany(mappedBy="group")
private List<User> users;
}
違いは、グループがユーザーのリファレンスを保持しているかどうかです。
ということは、これだけの違いなのかな? どちらがおすすめなのかな?
解決方法は?
主な違いは、双方向リレーションシップは双方向のナビゲーションアクセスを提供し、明示的なクエリなしで相手側にアクセスできることです。また、双方向にカスケード・オプションを適用することも可能です。
特に1対多や多対多のリレーションシップでは、ナビゲーションアクセスが常に良いとは限らないことに注意してください。例えば
Group
を含む数千の
User
s:
-
どのようにアクセスするのですか?これだけ多くの
User
を使用する場合、通常はフィルタリングやページ送りを行う必要があり、いずれにせよクエリを実行する必要があります。 コレクションフィルタリング 私にとってはハックにしか見えません)。開発者によっては、このような場合、メモリ上でフィルタリングを適用する傾向がありますが、これは明らかにパフォーマンス的によくありません。このような関係があると、この種の開発者がパフォーマンスへの影響を考えずに使ってしまう可能性があることに注意してください。 -
をどのように追加しますか?
User
をGroup
? 幸いなことに、Hibernate はリレーションシップを永続化する際に所有者側を見るので、リレーションシップに設定するのはUser.group
. しかし、メモリ上のオブジェクトの一貫性を保ちたい場合は、さらにUser
にGroup.users
. しかし、これではHibernateがGroup.users
をデータベースから取得します。
からの提言には賛成できないわけです。 ベストプラクティス . ユースケース(両方向のナビゲーションアクセスが必要か)と起こりうるパフォーマンスへの影響を考慮し、双方向のリレーションシップを慎重に設計する必要があります。
こちらもご覧ください。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
SpringBootApplication を型解決できない。
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み] JPA OneToMany/ManyToOne 双方向アソシエーションにおける「アソシエーションの逆側」とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
Methodのinvokeメソッド実装のJavaリフレクション
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
javaでよく使われる英単語
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
テストが見つかりませんでした
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決