コンストラクタ
Ebean では、デフォルトコンストラクタは必要ありません。エンティティビーンのインスタンスを作成するときは、必須のプロパティまたは NULL 許容でないプロパティを提供するために、コンストラクタを使用する必要があります。
たとえば、顧客エンティティビーンに name プロパティが必要な場合、コンストラクタ内でそれを作成し、Kotlin の NULL 許容でないタイプを使用できます。
...
@Entity
class Customer(name : String) : BaseModel() {
@Length(100)
var name: String = name // Kotlin non-nullable type
}
Kotlin での使用をお勧めするコンストラクタのスタイルは、上記のコンストラクタパラメータをプロパティに割り当てる形式です。エンティティビーンのプロパティには、マッピングアノテーション (@Length など) を付加することが多く、それらのアノテーションをコンストラクタ (アノテーションのターゲットが多数あるため。メソッド、フィールド、パラメータなど) に含めないようにすると、より簡単かつ明確になる場合があります。
NULL 以外許容型
Ebean は Kotlin の NULL 許容でないタイプを認識し、自動的にそれらを @NotNull として処理します。プロパティが Kotlin の NULL 許容でないタイプの場合、@NotNull、@Column(nullable=false)、または @ManyToOne(optional=false) は指定する必要はありません。
マップされたスーパークラス
whenCreated と whenModified のような io.ebean.Model を拡張し、マップされたスーパークラスを持つことは一般的です。
@MappedSuperclass
abstract class BaseModel : Model() {
@Id
var id: Long = 0
@Version
var version: Long = 0
@WhenCreated
lateinit var whenCreated: Instant
@WhenModified
lateinit var whenModified: Instant
}
whenCreated プロパティと whenModified プロパティに lateinit を使用し、それらを NULL 許容型として扱うのは問題ありません。
上記の例のように、@Id プロパティには NULL 許容でない Int = 0 および Long = 0 を使用することをお勧めします (JVM のプリミティブ int と long)。
@OneToMany
コレクションタイプ @OneToMany と @ManyToMany では、NULL 許容でない変更可能なリストを使用し、それらを mutableListOf() で初期化することをお勧めします。Ebean の拡張機能によりこれが最適化され、コレクションタイプは必要に応じてのみ初期化されます (したがって、Kotlin の NULL 許容でないコレクションタイプとしてモデル化することをお勧めします)。
@Entity
@Table(name = "orders")
class Order(customer: Customer) : BaseModel() {
...
@OneToMany(mappedBy = "order", cascade = [CascadeType.PERSIST])
var details: MutableList<OrderDetail> = mutableListOf()
}