MappedSuperclass

多数のエンティティビーンで共通のプロパティには@MappedSuperclassを使用します。

@Id@Version@WhenModifiedプロパティを持つマッピングされたスーパークラスがあり、マッピングされたスーパークラスがModelを拡張するのが一般的です。

package org.example.domain;

import io.ebean.Model;
import io.ebean.annotation.WhenCreated;
import io.ebean.annotation.WhenModified;

import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;
import java.time.Instant;

/**
 * Base domain object with Id, version, whenCreated and whenModified.
 */
@MappedSuperclass
public abstract class BaseDomain extends Model {

  @Id
  long id;

  @Version
  Long version;

  @WhenCreated
  Instant whenCreated;

  @WhenModified
  Instant whenModified;

  // getters and setters
  ...

}
  
package org.example.domain

import io.ebean.annotation.WhenCreated
import io.ebean.annotation.WhenModified
import java.time.Instant
import javax.persistence.Id
import javax.persistence.MappedSuperclass
import javax.persistence.Version

@MappedSuperclass
open class BaseDomain : Model() {

  @Id
  var id: Long = 0

  @Version
  var version: Long = 0

  @WhenModified
  lateinit var whenModified: Instant

  @WhenCreated
  lateinit var whenCreated: Instant

}
  

その後、エンティティビーンがこれを拡張して共通のプロパティを継承します。

CustomerはBaseDomainを拡張します

...
@Entity
public class Customer extends BaseDomain {

  String name;

  LocalDate registered;
  ...
  
package org.example.domain

import javax.persistence.Entity

@Entity
class Customer : BaseDomain() {

  var name: String? = null
}
  

Kotlinには複数のコンストラクタスタイルがあります。エンティティビーンの優先コンストラクタスタイルの詳細はこちらを参照してください。