@Entityとは?【初心者向け】絶対わかるSpring徹底解説

こんにちは!今回は、Spring Frameworkでエンティティクラスをマッピングするために使用されるアノテーション、@Entityについて詳しく解説します。このアノテーションは、データベースとのやり取りをするための基盤となる部分です。エンティティを正しく設定することで、データの永続化(保存や読み込み)がスムーズに行えます。


@Entityとは?

@Entityは、Javaクラスをデータベースのテーブルと対応づけるために使用されるアノテーションです。つまり、エンティティクラスはデータベースのテーブルを表し、そのフィールドはテーブルの列(カラム)に対応します。

例えば以下のようなクラスであれば、データベースからデータを取得したときに、ユーザー名やメールアドレスといった対応するフィールドに自動的に値がマッピングされます。(更新や登録時にもマッピングされます。)

@Entity
public class User {

    private Long id;

    private String name;
    private String email;

    // Getters and Setters
}

上記の例では、@Entityを付けたクラスがデータベースのテーブルになり、各フィールドがカラムに変換されます。


基本的な使い方

上記のコードでも一応動きますが、エンティティクラスを定義するためには、以下の3つのポイントを押さえましょう。

  1. @Entityアノテーションをクラスに付ける
  2. @Idアノテーションでプライマリキー(主キー)を指定する
  3. @GeneratedValueアノテーションで主キーの自動生成方法を定義する

例: ユーザー情報を表すエンティティ

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

    private String name;
    private String email;
    
    // コンストラクタ、ゲッター、セッター
}

このコードでは、idフィールドが主キーとなり、自動的に値が生成されます。nameemailといったフィールドは、データベースの列として保存されます。

@Idと@GeneratedValue

エンティティには必ず一意の識別子(主キー)を持たせる必要があります。そのために使うのが@Idです。@GeneratedValueは、その主キーを自動生成する際に利用されます。

  • strategy = GenerationType.AUTO: JPAが適切な生成方法を自動的に選択します。
  • strategy = GenerationType.IDENTITY: データベースでのID自動生成を使用します。
  • strategy = GenerationType.SEQUENCE: シーケンスを使用してIDを生成します。
  • strategy = GenerationType.TABLE: テーブルベースのID生成を使用します。

@Columnアノテーション

フィールドがデータベースのカラムにマッピングされますが、特定のカラム名や属性を指定したい場合は、@Columnアノテーションを使います。

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

    @Column(name = "product_name", nullable = false)
    private String name;

    @Column(name = "price", precision = 2)
    private double price;

    // Getters and Setters
}

上記の例では、nameフィールドがproduct_nameというカラムにマッピングされ、priceフィールドは小数点以下2桁までの値として保存されます。


@Tableアノテーション

デフォルトでは、エンティティクラス名がそのままテーブル名として使用されますが、@Tableアノテーションを使うと、異なるテーブル名を指定できます。

@Entity
@Table(name = "users_table")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // Getters and Setters
}

ここでは、クラス名がUserであっても、データベースではusers_tableという名前のテーブルにデータが保存されます。


リレーション(@OneToMany、@ManyToOne、@ManyToMany)

エンティティ同士の関係をマッピングするためには、以下のようなアノテーションが使われます。

  1. @OneToMany:1対多の関係を表します。例えば、1人のユーザーが複数の注文を持つ場合に使用します。
  2. @ManyToOne:多対1の関係を表します。例えば、複数の注文が1つのユーザーに関連付けられる場合に使用します。
  3. @ManyToMany:多対多の関係を表します。例えば、複数の学生が複数のクラスに所属している場合に使用します。

例: 1対多の関係

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

    private String name;

    @OneToMany(mappedBy = "user")
    private List<Order> orders;
}
@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String product;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

この例では、1人のユーザーが複数の注文を持っており、注文は1人のユーザーに関連付けられています。


@Transientアノテーション

データベースに保存したくないフィールドには、@Transientアノテーションを使います。このフィールドは、エンティティオブジェクトの一部として扱われますが、データベースには保存されません。

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

    private String name;

    @Transient
    private int age;  // データベースに保存されない
}

@Entityの引数

@Entityアノテーション自体は引数を持ちませんが、関連する他のアノテーション(@Id@GeneratedValueなど)を使用して、細かい設定が可能です。


おわりに

@Entityは、データベースとのやり取りにおいて非常に重要なアノテーションです。この記事では、基本的な使い方から応用までを解説しました。実際にコードを書いて、エンティティクラスの作成を試してみてください!データベースの操作がより簡単に、効率的になることでしょう。

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

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

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

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

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

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

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

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