
こんにちは!今回は、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の使い方と引数を徹底解説!【初心者向け】
