JPA関連アノテーションの基本として-その1-


@Entityアノテーションと@Idアノテーション

まずは、これが無いと始りません。@Entityは該当のクラスがエンティティであることを指定し、@Idはプライマリキーとなるプロパティかフィールドを指定します。

@Entity
public class Customer {

  @Id
  private Long id;
  private String firstname;
  private String lastname;
  // ・・
}

@Idは以下の様に指定することもできます。というかこっちの方が一般的か?

  @Id
  public Long getId() { return id; }

@Tableアノテーション

@Entityでは、該当のクラス名がテーブルとマッピングされますが、異なるテーブルとマッピングさせたい場合は@Tableでテーブル名を指定します。

@Entity
@Table(name="CUST")
public class Customer {

以下のようにスキーマも指定できます。

@Entity
@Table(name="CUST", schema="RECORDS")
public class Customer {

@GeneratedValueアノテーション

@Idで指定したプライマリキーの採番方法を指定します。

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  public Long getId() { return id; }

strategy として、Id の生成方法を指定します。GenerationTypeとしては、AUTO, IDENTITY, SEQUENCE, TABLEがある。上記例では、id カラムが identity 列として指定。シーケンスを使う場合は以下のような指定が可能。

  @Id
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CUST_SEQ")
  @SequenceGenerator(name="CUST_SEQ", allocationSize=25)
  public Long getId() { return id; }

@Columnアノテーション

カラム属性を指定します。プロパティかフィールドに指定します。

@Entity
public class Customer {
    @Column(name = "first_name", nullable = false, length = 30)
    public String getFirstname(){ return firstname };

この例では、first_nameというカラム名で、非null、カラム長を30として指定している例となります。

@Transientアノテーション

永続化対象外とするプロパティやフィールドを指定します。

@Entity
public class Employee {
    @Id int id;
    @Transient User currentUser;

この例では、currentUserはテーブルへのマッピング対象外となります。

@MappedSuperclassアノテーション

Entityを親クラスと子クラスの2つで定義したい場合、親クラス側へは、@Entityアノテーションではなく@MappedSuperclassアノテーションを指定します。

@MappedSuperclass
public abstract class BaseEntity {
  @Id protected Long id;
  // ・・・
}

@Entity
public class Customer extends BaseEntity {
  public String name;
  // ・・・
}

@MappedSuperclassを付けないと、BaseEntity の id は永続化されません。

次回は

次回は、テーブル間のマッピング用のアノテーション@ManyToOne、@OneToOne、@OneToMany などについて記載します。

JPAJavaDoc

https://java.sun.com/javaee/5/docs/api/javax/persistence/package-summary.html






Pro JPA 2 (Expert's Voice in Java)

Pro JPA 2 (Expert's Voice in Java)