@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 について知ることであり、公式ドキュメントを再説明することではありません。
GO TO FULL VERSION