@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 idGenerators)を使用して、ServerConfigにIdGeneratorを登録します。

クラスパススキャンを使用してエンティティBeanを検索する場合、IdGeneratorの実装も自動的に検出して登録されるため、この場合はServerConfigにIdGeneratorを手動で登録する必要はありません。

3. @GeneratedValue

次に、ジェネレーターがカスタムIdGeneratorの名前である@GeneratedValueを使用して、EbeanにカスタムIdGeneratorを使用するように指示できます。

@Id @GeneratedValue(generator = "shortUid")
String id;

遅延ロードなし

@Idプロパティは、遅延ロードを呼び出しません。

データベースプラットフォーム

サポートされているすべてのデータベースは、IdentityまたはSequences(またはその両方)を使用し、Ebeanはデータベースプラットフォームに基づいて適切なID生成戦略を選択します。

データベース戦略
H2Identity(シーケンスもサポート)
PostgresIdentity(serialとして、シーケンスもサポート)
MySqlIdentity
OracleSequences(Identityもサポート)
DB2Identity(シーケンスもサポート)
SQL ServerIdentity
SQLiteIdentity
SqlAnywhereIdentity