@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 |