こんにちは!今回は、Spring Frameworkでエンティティクラスをマッピングするために使用されるアノテーション、@Entity
について詳しく解説します。このアノテーションは、データベースとのやり取りをするための基盤となる部分です。エンティティを正しく設定することで、データの永続化(保存や読み込み)がスムーズに行えます。
@Entityとは?
@Entity
は、Javaクラスをデータベースのテーブルと対応づけるために使用されるアノテーションです。つまり、エンティティクラスはデータベースのテーブルを表し、そのフィールドはテーブルの列(カラム)に対応します。
例えば以下のようなクラスであれば、データベースからデータを取得したときに、ユーザー名やメールアドレスといった対応するフィールドに自動的に値がマッピングされます。(更新や登録時にもマッピングされます。)
@Entity
public class User {
private Long id;
private String name;
private String email;
// Getters and Setters
}
上記の例では、@Entity
を付けたクラスがデータベースのテーブルになり、各フィールドがカラムに変換されます。
基本的な使い方
上記のコードでも一応動きますが、エンティティクラスを定義するためには、以下の3つのポイントを押さえましょう。
@Entity
アノテーションをクラスに付ける@Id
アノテーションでプライマリキー(主キー)を指定する@GeneratedValue
アノテーションで主キーの自動生成方法を定義する
例: ユーザー情報を表すエンティティ
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String email;
// コンストラクタ、ゲッター、セッター
}
このコードでは、id
フィールドが主キーとなり、自動的に値が生成されます。name
やemail
といったフィールドは、データベースの列として保存されます。
@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)
エンティティ同士の関係をマッピングするためには、以下のようなアノテーションが使われます。
- @OneToMany:1対多の関係を表します。例えば、1人のユーザーが複数の注文を持つ場合に使用します。
- @ManyToOne:多対1の関係を表します。例えば、複数の注文が1つのユーザーに関連付けられる場合に使用します。
- @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公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓
@PathVariableの使い方と引数を徹底解説!【初心者向け】
@RequestBodyの使い方と引数を徹底解説!【初心者向け】