Dev Study
← 解説「エンティティ — テーブルを表すクラス」に戻る

サンプルコードで身につける: エンティティ — テーブルを表すクラス

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1最小のエンティティ

@Entity() でテーブル、@PrimaryGeneratedColumn() で自動採番の主キー、@Column() で列を表す最小の対応関係を示す例です。「クラス = テーブル、プロパティ = 列」という ORM 共通の基本発想がそのまま現れています。

import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";

@Entity() // users テーブルに対応
export class User {
  @PrimaryGeneratedColumn() // 自動採番される id 列
  id: number;

  @Column() // name 列
  name: string;

  @Column() // email 列
  email: string;
}

2列オプションで制約と既定値を表す

@Column() に渡すオプションで、NULL 許可・一意制約・既定値・長さ上限といった列の制約を宣言する例です。これらはそのまま生成される DDL の制約に対応し、DB レベルでデータの形を守る役割を持ちます。

import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 50 }) // VARCHAR(50)
  name: string;

  @Column({ unique: true }) // 重複を許さない
  email: string;

  @Column({ nullable: true }) // NULL を許可(任意項目)
  bio: string | null;

  @Column({ default: true }) // 既定値つき
  isActive: boolean;
}

3エンティティと DTO は別物

DB の形(エンティティ)を API の出力にそのまま使うと、パスワードハッシュのような秘密の列まで漏れてしまうことを再現した例です。レスポンス用の DTO へ詰め替えて初めて安全になる、という分離の理由を具体的に示します。

TypeScript

4作成日時・更新日時の自動記録

@CreateDateColumn と @UpdateDateColumn は、行の作成時と更新時にタイムスタンプを自動で入れてくれる特別な列です。実務ではほぼすべてのテーブルに付ける定番で、自分で日時を代入する手間とミスをなくせます。

import {
  Entity, Column, PrimaryGeneratedColumn,
  CreateDateColumn, UpdateDateColumn,
} from "typeorm";

@Entity()
export class Article {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @CreateDateColumn() // INSERT 時に自動で現在時刻が入る
  createdAt: Date;

  @UpdateDateColumn() // UPDATE のたびに自動で更新される
  updatedAt: Date;
}

5実務的な注文エンティティ

金額・状態・論理削除など、実務の注文テーブルでよく使う列を盛り込んだ例です。enum 型の status 列や、行を物理削除せず日時で印を付ける @DeleteDateColumn(ソフトデリート)といった現場の定番パターンを示します。

import {
  Entity, Column, PrimaryGeneratedColumn,
  CreateDateColumn, DeleteDateColumn,
} from "typeorm";

@Entity()
export class Order {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: "int" }) // 金額は誤差を避けて整数(最小単位)で持つ
  amount: number;

  @Column({ type: "enum", enum: ["pending", "paid", "shipped"], default: "pending" })
  status: string;

  @CreateDateColumn()
  createdAt: Date;

  @DeleteDateColumn() // ソフトデリート: 物理削除せず日時で印を付ける
  deletedAt: Date | null;
}