@ManyToOne, @OneToMany, @ManyToManyの使い方

はじめに

こんにちは! 今回は、Spring Data JPAHibernateで頻繁に使われるアノテーション、@ManyToOne@OneToMany、そして@ManyToManyについてお話しします。 これらのアノテーションを使いこなすことで、データベースのテーブル間の関係を簡単に設定でき、Webアプリケーションの開発がぐっと楽になりますよ!


1. エンティティ間のリレーションとは?

エンティティとは、データベースのテーブルに対応するJavaクラスのことです。例えば、UserProductなどがあります。 データベースでは、複数のテーブルが相互に関連付けられることが多く、これを「リレーション」と呼びます。

リレーションには以下の3種類があります。

  1. @ManyToOne(多対一)
  2. @OneToMany(一対多)
  3. @ManyToMany(多対多)

それでは、これらのリレーションの使い方を順番に見ていきましょう!


2. @ManyToOneの使い方

@ManyToOneとは?

@ManyToOneは、「多対一」の関係を表します。つまり、多くのエンティティが1つのエンティティに関連付けられるという意味です。

具体例:

例えば、「多くの従業員(Employee)は1つの部門(Department)に所属する」という関係です。

コード例:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;

    // ゲッターとセッター
}
@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    
    // ゲッターとセッター
}

説明:

  • @ManyToOneは、EmployeeエンティティがDepartmentエンティティに多対一で関連付けられていることを示します。
  • @JoinColumn(name = "department_id")により、Employeeテーブルにdepartment_idという外部キーが作成されます。

3. @OneToManyの使い方

@OneToManyとは?

@OneToManyは、「一対多」の関係を表します。つまり、1つのエンティティが複数のエンティティに関連付けられるという意味です。

具体例:

例えば、「1つの部門(Department)は多くの従業員(Employee)を持つ」という関係です。

コード例:

Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "department")
    private List<Employee> employees;

    // ゲッターとセッター
}

説明:

  • @OneToMany(mappedBy = "department")により、DepartmentエンティティがEmployeeエンティティと一対多で関連付けられています。
  • mappedBy属性は、Employeeクラスのdepartmentフィールドによって関連付けられていることを示します。

4. @ManyToManyの使い方

@ManyToManyとは?

@ManyToManyは、「多対多」の関係を表します。つまり、多くのエンティティが多くのエンティティに関連付けられるという意味です。

具体例:

例えば、「多くの学生(Student)は多くのコース(Course)を受講する」という関係です。

コード例:

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private List<Course> courses;

    // ゲッターとセッター
}
@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToMany(mappedBy = "courses")
    private List<Student> students;

    // ゲッターとセッター
}

説明:

  • @ManyToManyにより、StudentエンティティとCourseエンティティが多対多で関連付けられます。
  • @JoinTableアノテーションを使って、student_courseという中間テーブルを作成し、student_idcourse_idで関連付けます。

5. 各アノテーションの引数について

1. @JoinColumn

@JoinColumnは、外部キーの列名を指定します。例えば:

@ManyToOne
@JoinColumn(name = "department_id")
private Department department;

2. cascade属性

cascade属性は、関連するエンティティに対して操作を自動的に伝播させるために使用します。

@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees;
  • CascadeType.ALL: すべての操作を伝播
  • CascadeType.PERSIST: 保存操作を伝播
  • CascadeType.REMOVE: 削除操作を伝播

3. fetch属性

データの取得方法を指定するための属性です。

  • FetchType.EAGER:関連エンティティを即時ロード(デフォルトで@ManyToOne)。
  • FetchType.LAZY:関連エンティティを遅延ロード(デフォルトで@OneToMany)。
@ManyToMany(fetch = FetchType.LAZY)
private List<Course> courses;

6. 実際の使いどころ

  1. @ManyToOneの活用例:例えば、ブログ記事(Post)が多くのコメント(Comment)を持つ場合、コメントが1つの記事に関連するケースで使えます。
  2. @OneToManyの活用例:1人のユーザー(User)が複数の注文(Order)を持つような場面で利用します。
  3. @ManyToManyの活用例:複数のユーザー(User)が複数のグループ(Group)に所属できるソーシャルメディアアプリなどでよく使われます。

まとめ

今回は、Spring Data JPAの**@ManyToOne**、@OneToMany@ManyToManyの使い方について詳しく解説しました。

  • @ManyToOne:多くのエンティティが1つのエンティティに関連
  • @OneToMany:1つのエンティティが複数のエンティティに関連
  • @ManyToMany:多くのエンティティが多くのエンティティに関連

これらのアノテーションを理解すれば、複雑なデータベース設計も思いのままです。 ぜひ、この機会に試してみてくださいね!

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

@GroupSequenceの使い方と引数を徹底解説!【初心者向け】

@AssertTrueと@AssertFalseの使い方と違いを徹底解説!【初心者向け】

@Max, @Min, @Sizeアノテーションの使い方と違いを解説!【初心者向け】

@NotNull、@NotBlank、@NotEmptyの違いは?【初心者向け】

@DateTimeFormatと@NumberFormatの使い方徹底解説!

タイトルとURLをコピーしました