[JPA]双方向関連関係(2)


双方向の関連関係を利用する際に最もよく犯す誤りを理解してください.

前の記事では、上記の関連関係を双方向関連関係と呼び、この場合「外来鍵がある場所が主人であることを特定する」というルールに基づいて、メンバーのチームを関連関係の主人と決定する.
次のコードを作成するとします.
Member member = new Member();
member.setUsername("member1");
em.persist(member);

Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member);		// 주목 해야 할 부분

em.persist(team);
意図が単純だ.これは、メンバーとチームオブジェクトを生成し、生成したメンバーをチームに帰属させるために作成されたコードです.このコードを実行した後、データベースの値は正しいですか?確認してみましょう.

MEMBERテーブルに追加されたデータを見ると、TEAM ID値はNULLである.私の意図はTeamaのID値2を加えたいのですがなぜありませんか...当ててごらん
TeamのmembersにはmappedBy属性があります.これは、この変数が双方向の関連関係の所有者ではないことを意味します.すなわち、読み取り専用(偽マッピング)であるため、この変数にメンバーを配置しても、実際にはメンバーテーブルに影響を与えません.
したがって、予想通りにコードを変更すると、
// team.getMembers().add(member); 이 부분은 사실상 의미가 없는 코드
member.setTeam(team)
上記のように修正してプログラムを再実行したら?

私の意図で、価格設定がよくできていることが確認できます.
もしそうなら、ここにはいくつかの考えるべき問題があります.開発のたびに、このように関連関係のある主人を探して、その主人に価格を割り当ててもいいですか?前の例では、2つの簡単なテーブルを使用して例を示しましたが、実際にビジネスロジックを担当している多くのテーブル間の関連関係を考慮すると、それほど簡単な問題ではないようです.
この問題を解決する簡単な方法がある...!一言で言えば
関連関係の主人だけを考えないで、両側に置いてください.
そう言える!JPAのみで計算すると、必ず関連関係のオーナーにのみ値を提供するのが正しいのですが、オブジェクト向けの観点から両方とも値を提供するはずです.△また、関連関係の主人にだけ置くと、問題が発生する可能性があります.
team.getMembers().add(member);
member.setTeam(team)
つまり、上のように直接両側に置くと、混同しないだけでなく、安全です.
これをより簡潔に処理する方法は,関連関係編を構築する方法である.
public void changeTeam(Team team) {
    this.team = team;
    team.getMembers().add(this);
}
以上のように、1つのメソッド呼び出しで2つのメソッド呼び出しに値を置くように、メンバークラスに関連関係編を作成するメソッドです.この双方向関連関係でよく見られるエラーと解決方法を理解した.最後に整理します.
にほうこうマッピングのていり
  • の一方向マッピングのみで関連マッピング(設計フェーズ)
  • が完了する.
  • 双方向マッピングは、テーブル構造を変更するのではなく、必要に応じて追加するクエリ(オブジェクトグラフィックブラウズ)機能を逆方向に追加するだけである
  • .