Kotlin Academy · レッスン

Exposed DAO:Entityクラスとリレーションシップ

DAO APIを使ってテーブルをEntityクラスにマッピングし、リレーションシップをたどります。

レッスン 4/413 ステップ

「Exposed DAO:Entityクラスとリレーションシップ」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

Exposed DAOレイヤーとは

Exposed DAO(Data Access Object)レイヤーは、Query DSLをActive RecordスタイルのAPIでラップします。テーブルの行に対応するEntityサブクラスを定義し、エンティティのインスタンスからプロパティを直接読み書きできます。

Entityの定義

LongIdTableとEntityサブクラスを組み合わせます。各エンティティクラスには、クエリを処理するEntityClassコンパニオンがあります。

object Users : LongIdTable("users") {
    val name  = varchar("name", 100)
    val email = varchar("email", 255)
}

class User(id: EntityID<Long>) : LongEntity(id) {
    companion object : LongEntityClass<User>(Users)
    var name  by Users.name
    var email by Users.email
}

Entityの作成

transaction { }内でEntity.new { }を使用すると、新しい行を作成してエンティティのインスタンスを取得できます。

val alice: User = transaction {
    User.new {
        name  = "Alice"
        email = "alice@example.com"
    }
}

Entityの検索

EntityClassコンパニオンには、findById(id)、all()、find { condition }という検索メソッドがあります。

transaction {
    val user: User? = User.findById(1L)
    val allUsers: SizedIterable<User> = User.all()
    val filtered = User.find { Users.name like "Al%" }.toList()
}

Entityの更新

エンティティを読み込み、トランザクション内でそのプロパティを変更します。トランザクションがコミットされると、Exposedが自動的にUPDATEを発行します。

transaction {
    val user = User.findById(1L) ?: error("Not found")
    user.name = "Alice Smith"
    // UPDATE issued on transaction commit
}

Entityの削除

トランザクション内でentity.delete()を呼び出すと、対応する行を削除できます。

transaction {
    User.findById(5L)?.delete()
}

1対多のリレーションシップ

テーブルではreference()を使用し、エンティティでは委譲されたbyプロパティを使用して、子から親エンティティを参照します。親からreferrersOnを通じて子のリストにアクセスできます。

object Posts : LongIdTable("posts") {
    val title    = varchar("title", 300)
    val authorId = reference("author_id", Users)
}
class Post(id: EntityID<Long>) : LongEntity(id) {
    companion object : LongEntityClass<Post>(Posts)
    var title  by Posts.title
    var author by User referencedOn Posts.authorId
}
// On User entity:
val posts by Post referrersOn Posts.authorId

多対多のリレーションシップ

中間の結合テーブルを使用します。それをEntityClassとして公開し、via()を使って両側からアクセスします。

object UserRoles : Table("user_roles") {
    val user = reference("user_id", Users)
    val role = reference("role_id", Roles)
}
// On User entity:
var roles by Role via UserRoles

Eager LoadingとLazy Loading

デフォルトでは、Exposedは関連エンティティを遅延ロードします。つまり、アクセスするたびにSQLクエリが発行されます。load()またはwith()を使用してリレーションを先行ロードし、N+1クエリ問題を回避します。

transaction {
    User.all().with(User::posts).forEach { user ->
        println("${user.name}: ${user.posts.count()} posts")
    }
}

トランザクション内のキャッシュ

Exposedはトランザクション内でエンティティのインスタンスをキャッシュします。同じトランザクション内で同じエンティティをIDによって複数回取得すると、同じメモリ上のオブジェクトが返されるため、不要なDBへの往復は発生しません。

DAOとQuery DSLの使い分け

リレーションシップを含むオブジェクト指向のアクセスパターンが必要な場合はDAOレイヤーを使用します。一括操作、複雑な結合、集約、またはパフォーマンスを重視してSQLを正確に制御したい場合はQuery DSLを使用します。

理解度チェック

Exposed DAOを使って新しい行を作成し、すぐにエンティティのインスタンスを取得するにはどうしますか。

振り返り:Exposed DAO — Entityクラスとリレーションシップ

主なポイント:

  • LongIdTableとLongEntityサブクラスを組み合わせます。プロパティは列定義に委譲されます
  • Entity.new { } — 作成。findById()、find { }、all() — 検索。entity.delete() — 削除
  • 1対多:referencedOn(子側)、referrersOn(親側)
  • 多対多:結合テーブル + via()
  • with()を使用してリレーションを先行ロードし、N+1クエリを回避します
無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「Exposed DAO:Entityクラスとリレーションシップ」レッスンは無料ですか?

はい。「Exposed DAO:Entityクラスとリレーションシップ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「Exposed DAO:Entityクラスとリレーションシップ」で何を学びますか?

DAO APIを使ってテーブルをEntityクラスにマッピングし、リレーションシップをたどります。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Exposed DAO:Entityクラスとリレーションシップ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Exposedのセットアップ:データベース接続とTransaction DSL
  2. Table DSLによるテーブル定義
  3. Query DSLによるCRUD:insert、select、update、delete
  4. Exposed DAO:Entityクラスとリレーションシップ
← Kotlin Academyに戻る