@Id
プロパティを@Idプロパティとしてマークします。
@Entity
public class Contact {
@Id
long id;
...
}
@GeneratedValue
プロパティに@Idアノテーションを付けると、Ebeanは、その型が数値型またはUUID型の場合、適切なIDジェネレーターを自動的に割り当てます。
つまり、Ebeanでは、@GeneratedValueアノテーションを追加することも事実上冗長です。
@Id
long id;
// ... is effectively the same as
@Id @GeneratedValue
long id;
@Identity
Ebeanには、データベースのidentityまたはシーケンスに対して開始値、キャッシュ値、デフォルト/常に生成オプションを指定するために使用する@Identityアノテーションもあります。
これは、関連付けられたテーブルに大量の挿入が予想され、それをサポートするデータベースで通常よりも高いIDキャッシングを行うことで、生成されたID値/シーケンスに関する競合を軽減したい場合に、キャッシュオプションを具体的に設定するために使用します。Postgres、Oracle、NuoDBはすべて、identityキャッシュオプションの設定をサポートしています。ID値のキャッシュを大きくする欠点は、データベースが再起動された場合、ID値に大きなギャップが生じる可能性があることです。
@Id @Identity(start=10000, cache=500)
long id;
クラスに@Identityを指定することもできます。これは、通常、IDプロパティがMappedSuperclassから継承されている場合です。
@Entity
@Identity(start=10000, cache=500)
public class Contact {
@Id
long id;
...
}
UUID
@Idの型がUUIDの場合、Ebeanはそのプロパティに適切なIDジェネレーターを自動的に割り当てます。
// an appropriate UUID based Id generator
// is automatically assigned
@Id
UUID id;
UUIDと@GeneratedValue
@IdではないUUIDがある場合、@GeneratedValueを追加すると、Ebeanはそれに適切なUUIDジェネレーターを割り当てます。
/** The Id property using DB Identity or Sequence */
@Id @GeneratedValue
private long id;
/** Alternate unique UUID property */
@GeneratedValue @Column(unique = true)
private UUID uid;
文字列
@Idの型が文字列の場合、EbeanはID値がアプリケーションによって供給されると想定します。この場合、IDプロパティにはIDジェネレーターは割り当てられません。
@Id
String code;
これは、国の主キーとして使用されるISO国コードの例です。
@Idプロパティのないエンティティ
@IdプロパティのないエンティティBeanをモデル化できます。これには、ビューをモデル化する場合と、「挿入のみ」のテーブルをモデル化する場合(イベントのログなど)の2つのケースがあります。
ビュー
エンティティBeanが@Viewにモデル化されている場合、ビューには主キーに相当する列がないことがよくあります。
例:@Idプロパティを持つビューに基づくエンティティ
@Entity
@View(name = "machine_stats")
public class MachineStats {
@ManyToOne
Machine machine;
LocalDate date;
@Sum // equivalent to @Aggregation("sum(totalKms)")
long totalKms;
@Sum
long hours;
@Max
BigDecimal rate;
@Aggregation("sum(cost)")
BigDecimal totalCost;
@Aggregation("max(totalKms)")
BigDecimal maxKms;
主キーのないテーブル
主キーが必要ない「追記のみ」のテーブルをモデル化する場合、@Idプロパティと実際の主キーがない方が望ましい場合があります。アプリケーションが決して必要としない、または使用しない主キーインデックスのコストを回避したい場合に、これが望ましい場合があります。
Postgresの場合、このタイプの「追記のみ」イベントタイプのテーブルには、@DbPartitionを使用してテーブルパーティショニングを頻繁に使用します。
例:主キー/ @Idプロパティのない追記のみのテーブル
/**
* Append only table with no Id property, no primary key (no primary key index).
*/
@DbPartition(mode = DAY, property = "eventTime")
@Entity
@Table(name = "machine_log")
public class MachineLog {
@Index
@NotNull
protected Instant eventTime;
@DbForeignKey(noConstraint = true)
@ManyToOne(optional = false)
protected Machine machine;
...
カスタムIDジェネレーター
カスタムIDジェネレーターの登録と使用がサポートされています。
1. io.ebean.config.IdGeneratorを実装する
public class ModUuidGenerator implements IdGenerator {
@Override
public Object nextValue() {
return ModUUID.newShortId();
}
@Override
public String getName() {
return "shortUid";
}
}
2. ServerConfigに登録する
addClass()またはadd(IdGenerator idGenerator)またはsetIdGenerators(Listを使用して、ServerConfigにIdGeneratorを登録します。
クラスパススキャンを使用してエンティティBeanを検索する場合、IdGeneratorの実装も自動的に検出して登録されるため、この場合はServerConfigにIdGeneratorを手動で登録する必要はありません。
3. @GeneratedValue
次に、ジェネレーターがカスタムIdGeneratorの名前である@GeneratedValueを使用して、EbeanにカスタムIdGeneratorを使用するように指示できます。
@Id @GeneratedValue(generator = "shortUid")
String id;
遅延ロードなし
@Idプロパティは、遅延ロードを呼び出しません。
データベースプラットフォーム
サポートされているすべてのデータベースは、IdentityまたはSequences(またはその両方)を使用し、Ebeanはデータベースプラットフォームに基づいて適切なID生成戦略を選択します。
| データベース | 戦略 |
|---|---|
| H2 | Identity(シーケンスもサポート) |
| Postgres | Identity(serialとして、シーケンスもサポート) |
| MySql | Identity |
| Oracle | Sequences(Identityもサポート) |
| DB2 | Identity(シーケンスもサポート) |
| SQL Server | Identity |
| SQLite | Identity |
| SqlAnywhere | Identity |