👫

JPAのmappedByとは

2022/02/10に公開

関係マッピング(リレーショナルマッピング)

  • オブジェクト指向設計の目標は自律的なオブジェクトたちの協力共同体を作る事である。
  • オブジェクトをテーブルに合わせてデータ重心的にモデリングすると協力関係を作ることは出来ない。
    • テーブルは外来キーでJOINを使用して関わってるテーブルを探す。
    • オブジェクトは参照を用いて関わってるオブジェクトを探す。
    • テーブルとオブジェクトの間にはこんな大きいギャップがある。
  • JPA(Hibernate)はORMである。
    • Object-Relational Mapping

関係マッピング(リレーショナルマッピング)時考慮事項

  1. 多重性
  2. 片方向, 両方向
  3. リレーションシップのオーナー

片方向リレーションシップ

  • MemberのみがTeam teamの参照を持っていてMember->Teamの片方向関係にある
  • TeamからはMemberに行けない。
  • オブジェクトのリレーションシップ
  • テーブルのリレーションシップ
  • JPAのリレーショナルマッピング
Member.java
@Entity
public class Member{
	@ManyToOne
	@JoinColumn(name = "TEAM_ID") // FK
	private Team team;
}
  • 片方向なのでTeam側にはマッピングしない。

両方向関係とリレーションシップのオーナー

  • オブジェクト同士に両方向に参照してメッセージをやり取りできる事を両方向リレーションシップと言う

  • 反面テーブルのリレーションシップには変わりない。

    • 実はテーブルにはリレーションの方向という事がない
    • テーブルはFKで両方行ける
  • JPAのリレーショナルマッピング

Member.java
@Entity
public class Member {
	@ManyToOne
	@JoinColumn(name = "TEAM_ID")
	private Team team;
}
Team.java
@Entity
public class Team {
	@OneToMany(mappedBy = "team")
	private List<Member> members = new ArrayList<>();
}

mappedBy

  • レーションシップのオーナーを決める事。
  • mapped by = "xxx"意味その通りxxxによってマッピングされている。つまり管理されている
  • mappedByがある所は読み取り専用になり指定しているところがリレーションシップのオーナーと言う意味
  • こういう事を指定しておく理由は上にも書いたようにオブジェクトは両方参照を持っていてその参照の中でどれかがFKを管理しDBとやりとるするかを決めなければならないからだ。指定された側がオーナーになり反対側は読み取り専用になる
Team.java
@Entity
public class Team {
	// membersにデータを入れてもDBに入らない
	@OneToMany(mappedBy = "team")
		// ↑ mappedByがある所、つまりオーナではない 
		// 指定された側、team(Member.team)がオーナーである。
	private List<Member> members = new ArrayList<>();
}

誰をオーナーにする?

  • 簡単に言うとFKがある所をオーナーに決めればいい。
  • ここではMember.teamがオーナーである。
  • ビジネス的な重要度は関係なくDBテーブルでFKを持っている所をオーナーに決める。

@JoinColumn

属性 説明 ディフォルト値
name mappingするFK名 field名_テーブルのPKカラム名,ex) member_id
referencedColumnName FKが参照する対象テーブルのカラム名 参照する対象テーブルのPKカラム名
foreignKey FK制約を直接指定可能、この属性はテーブルを生成するときのみ使用される(DDL)
unique, updatable.... @Columnと同じ属性たち...

(次)多様な関係マッピング(リレーショナルマッピング)

https://zenn.dev/dev_yoon/articles/a6bbef727880a8#%40manytoone(多対一)

Discussion