主キー

使用可能

@Id アノテーション

Hibernate の各 Entity エンティティには、主キーとなるフィールドが必要です。このフィールドには、このクラスのすべてのオブジェクトの一意の値が含まれます。通常、このフィールドには@Idアノテーションが付けられます。

一般的な形式:

@Id
Class Name;

例:

@Entity
@Table(name="user")
class User
{
   @Id
   @Column(name="id")
   public Integer id;

   @Embedded
   public UserAddress address;

   @Column(name="created_date")
   public Date createdDate;
}

注釈の配置

ちなみに、@Columnアノテーションはフィールドだけでなく、ゲッターやセッターなどのメソッドにも記述できます。例:

@Entity
@Table(name="user")
class User
{
    public Integer id;
    public Date createdDate;

   @Id
   @Column(name="id")
   public Integer getId() {
   	return this.id;
   }
   public void setId(Integer id)    {
  	this.id = id;
   }

   @Column(name="created_date")
   public Date getDate() {
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
      this. createdDate = date;
   }
}

このアプローチは、アノテーションがクラスだけでなくインターフェースにも追加され始めたときに登場しました。インターフェイスにはクラス フィールドはありませんが、ゲッターとセッターのメソッドがあります。Hibernate はこれらの標準の両方をサポートしています。

重要!クラスに@Entityアノテーションがある場合、そのすべてのフィールドは Hibernate によって永続フィールドとして扱われます ( @Transientアノテーションが指定されていない限り)。フィールドに注釈がまったくない場合でも、この場合、列名はクラスのフィールド名と等しいとみなされます。

ここで@Idアノテーションが重要な役割を果たします。アノテーションがクラスフィールドに配置されている場合、Hibernate はフィールドの名前と型を調べます。@Idアノテーションがメソッドに配置されている場合、Hibernate はメソッドの名前と型を調べます。

例 1:

@Entity
@Table(name="user")
class User
{
   @Id
    public Integer id;
    public Date createdDate;  //this field will be treated as if it had @Column(name=" createdDate ")

}

例 2:

@Entity
@Table(name="user")
class User
{
    public Integer id;
    public Date createdDate;

   @Id
   public Integer getId() {
   	return this.id;
   }
   public void setId(Integer id)    {
  	this.id = id;
   }

   public Date getDate() { //this field will be treated as if it had @Column(name=”date ”)
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
  	this. createdDate = date;
   }

}

@GeneratedValue アノテーション

新しいオブジェクトに自分で ID を割り当てることも、Hibernate に任せることもできます。Hibernate がオブジェクトに ID を割り当てる方法をよりよく理解できるように、特別なアノテーションが付いています。

@GeneratedValue

通常、このアノテーションは@Idアノテーションと同じフィールドをマークします。彼女には 4 つの ID 割り当て戦略があります。

  • オート
  • 身元
  • 順序
  • テーブル

指定された戦略を使用したアノテーションの例:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue(strategy = GenerationType.AUTO)
    public Integer id;

    public Date createdDate;
}

ポリシー値が指定されていない場合は、AUTO 戦略が選択されます。AUTO 戦略は、主に ID フィールドのデータ型に基づいて、Hibernate が ID 自体を割り当てることを意味します。

なぜタイプにこだわるのか?はい。ID タイプは文字列や GUID など、大きく異なる場合があるためです。例:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue
    public UUID id;

    public Date createdDate;
}

注: Java の GUID は、歴史的には UUID と呼ばれています。また、Hibernate は、要求に応じてオブジェクトに対して一意の UUID を生成できます。

さまざまな @GeneratedValue 戦略

GeneratedValue(strategy = GenerationType.IDENTITY)タイプを指定すると、Hibernate は ID 設定をデータベース層に委任します。通常、これには PRIMARY KEY、AUTOINCREMENT というラベルの付いた列が使用されます。

ただし、ID を一意にし、特別に指定したアルゴリズムに従って生成したい場合は、次のようにGeneratedValue(strategy = GenerationType.SEQUENCE)アノテーションを使用できます。

@Entity
@Table(name="user")
public class User {
	@Id
	@GeneratedValue(generator = "sequence-generator")
	@GenericGenerator(
  	name = "sequence-generator",
  	strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
  	parameters = {
    	@Parameter(name = "sequence_name", value = "user_sequence"),
    	@Parameter(name = "initial_value", value = "4"),
    	@Parameter(name = "increment_size", value = "1")
    	}
	)
	private long userId;

	// ...
}

ID を生成する方法は他にもたくさんあります。たとえば、複数の列で構成される複合一意キーがあるとします。オブジェクトをデータベースに書き込むときは、これらすべての列に値を入力する必要があります。

詳しくは述べません。それでも、私たちの講義の目的は Hibernate について知ることであり、公式ドキュメントを再説明することではありません。

コメント
  • 人気
  • 新規
  • 古い
コメントを残すには、サインインしている必要があります
このページにはまだコメントがありません