5.

【Spring】@Columnアノテーションとは

編集
この記事の要点
  • @ColumnJPA エンティティのフィールドと DB カラムを紐付けるアノテーション
  • デフォルトはフィールド名 = カラム名(キャメルケース → スネークケースは設定次第)
  • 主要属性: name, nullable, length, unique, columnDefinition
  • 更新除外: insertable = false / updatable = false
  • 型ごとの注意: String, BigDecimal, Enum, Date/LocalDateTime

 

基本的な使い方

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "user_name", length = 100, nullable = false)
    private String name;

    @Column(unique = true)
    private String email;

    @Column(columnDefinition = "TEXT")
    private String bio;

    @Column(name = "created_at", updatable = false)
    private LocalDateTime createdAt;
}

主要な属性

属性デフォルト用途
nameフィールド名カラム名指定
nullabletrueNULL 許可
length255 (String)VARCHAR の長さ
uniquefalseUNIQUE 制約
precision0DECIMAL の桁数
scale0DECIMAL の小数桁数
columnDefinitionautoカラム定義を直接指定
insertabletrueINSERT 時に含める
updatabletrueUPDATE 時に含める
table主テーブルJOIN 先テーブル

使用例

NOT NULL 制約 + UNIQUE

@Column(nullable = false, unique = true)
private String username;
// → username VARCHAR(255) NOT NULL UNIQUE

VARCHAR の長さ指定

@Column(length = 50)
private String code;
// → code VARCHAR(50)

TEXT 型(長文)

@Column(columnDefinition = "TEXT")
private String description;
// → description TEXT
// length 指定では不十分なときに使用

BigDecimal(金額・精度が重要な数値)

@Column(precision = 10, scale = 2)
private BigDecimal price;
// → price DECIMAL(10,2)
// 全 10 桁、うち小数 2 桁 → 最大 99999999.99

更新不可カラム(作成日時等)

@Column(name = "created_at", updatable = false)
@CreationTimestamp  // Hibernate: INSERT 時に自動セット
private LocalDateTime createdAt;

@Column(name = "updated_at")
@UpdateTimestamp  // Hibernate: UPDATE 時に自動更新
private LocalDateTime updatedAt;

列挙型(Enum)

public enum UserStatus { ACTIVE, INACTIVE, SUSPENDED }

@Enumerated(EnumType.STRING)  // 文字列で保存(推奨)
@Column(length = 20)
private UserStatus status;

// EnumType.ORDINAL(インデックス番号で保存)は順序変更で破綻するので非推奨

計算カラム(DB 側で生成)

@Column(insertable = false, updatable = false)
private LocalDateTime serverTimestamp;
// → INSERT/UPDATE 時にこのフィールドは含まれない
//   DB 側のデフォルト値 / トリガで設定

カラム命名規則(キャメル → スネーク)

Spring Boot + Hibernate のデフォルトでは、Java のキャメルケースを自動でスネークケースに変換します。

@Entity
public class User {
    private String firstName;  // → first_name カラム
    private String lastName;   // → last_name カラム
}

// 明示したい場合
@Column(name = "first_name")
private String firstName;

// 命名戦略の変更 (application.properties)
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
# → そのまま (firstName → firstName カラム)

@Column と関連アノテーション

@Id(主キー)

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)  // MySQL/PostgreSQL の AUTO_INCREMENT
@Column(name = "user_id")
private Long id;

// シーケンス (Oracle, PostgreSQL)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
private Long id;

// UUID
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;

@JoinColumn(外部キー)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
// → user_id BIGINT NOT NULL REFERENCES users(id)

@Temporal(古い Date 型用)

// 古い java.util.Date 用 (LocalDate/LocalDateTime なら不要)
@Temporal(TemporalType.DATE)
@Column(name = "birth_date")
private Date birthDate;

@Lob(Large Object: BLOB / CLOB)

@Lob
@Column(columnDefinition = "LONGTEXT")
private String content;

@Lob
private byte[] image;

制約と Bean Validation の併用

JPA の @Column は DDL 生成のためのもの、Bean Validation は実行時バリデーションのためのもの。両方付けるのが定石:

@Column(nullable = false, length = 100)
@NotNull
@Size(max = 100)
private String name;

@Column(unique = true)
@Email
private String email;

DDL 自動生成と運用

Hibernate は @Column 情報から CREATE TABLE 文を生成できますが、本番運用では推奨されません:

# application.properties
spring.jpa.hibernate.ddl-auto=update  # 開発:差分更新(非推奨:危険)
spring.jpa.hibernate.ddl-auto=create-drop  # テスト:起動時生成、終了時削除
spring.jpa.hibernate.ddl-auto=validate  # 本番:DB スキーマと一致するか検証のみ
spring.jpa.hibernate.ddl-auto=none  # 本番推奨:DDL は手動 / Flyway / Liquibase 管理

本番では Flyway / Liquibase でマイグレーション管理を推奨。

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. @After
  2. @Autowired
  3. @Bean
  4. @Before
  5. @Column
  6. @Component
  7. @Configuration
  8. @Controller
  9. @Data
  10. @Entity
  11. @GeneratedValue
  12. @Id
  13. @Modifying
  14. @PathVariable
  15. @PropertySource
  16. @Repository
  17. @RequestBody
  18. @RequestMapping
  19. @ResponseBody
  20. @RestController
  21. @Service
  22. @SpringBootApplication
  23. @Table
  24. @Transactional
  25. @Value