| この記事の要点 |
|
エラー内容
net.sf.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
net.sf.hibernate は Hibernate 2 系のパッケージ名です。Hibernate 3〜5 系では org.hibernate.id.IdentifierGenerationException となり、メッセージの末尾にエンティティのクラス名が付きます。Hibernate 6 系では文言が「Identifier of entity '...' must be manually assigned before calling 'persist()'」のように変わっていますが、原因と対処は同じです。
発生条件と原因
Hibernate のマッピングで主キー(id)の生成方法が「アプリ側で手動代入(assigned)」になっているのに、エンティティ(Bean)の id に値を入れずに save() / persist() を呼ぶと発生します。DB 側でいう PK に当たる項目に値がない状態で INSERT しようとしているため、Hibernate が事前に止めています。
「手動代入」扱いになるのは次のようなケースです。
- hbm.xml の
<id>内に<generator>を書いていない(省略時はassignedになる) <generator class="assigned"/>を明示している- JPA アノテーションで
@Idは付けたが@GeneratedValueを付けていない
DB のテーブルに AUTO_INCREMENT を設定していても、Hibernate のマッピング側でそれを伝えていなければ Hibernate は「アプリが ID を入れるはず」と判断します。DB の設定とマッピングの設定は別物という点が、このエラーの一番のつまずきどころです。
対処法
対処 1: 保存前に ID を代入する
社員番号や商品コードのような「業務上意味のあるキー(自然キー)」や、アプリ側で UUID を採番する設計なら、id を手動代入のままにして、保存前に必ず値をセットします。
User user = new User();
user.setId("U0001"); // 手動で ID を代入してから
user.setName("山田");
session.save(user); // 保存する
対処 2: 自動採番に切り替える(hbm.xml)
DB 側で AUTO_INCREMENT(MySQL)やシーケンス(Oracle / PostgreSQL)を使っている場合は、id タグ内に generator を指定します。
<id name="id" column="ID" type="long">
<generator class="native"/>
</id>
| generator | 動き | 向いている DB |
|---|---|---|
assigned | アプリが ID を代入(省略時の既定) | 自然キー・自前 UUID |
identity | DB の自動採番列を使う | MySQL / MariaDB / SQL Server |
sequence | DB のシーケンスから取得 | Oracle / PostgreSQL |
native | DB の方言に合わせて方式を自動選択 | DB を切り替える可能性がある場合 |
対処 2': 自動採番に切り替える(JPA アノテーション)
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // MySQL の AUTO_INCREMENT を使う
private Long id;
private String name;
}
落とし穴
- DB 側に自動採番がない:
IDENTITYを指定しても、テーブルの列に AUTO_INCREMENT が付いていなければ INSERT 時に別のエラー(ID が NULL / 既定値なし)になる。マッピングと DDL をそろえる - ID の型をプリミティブにしている:
int idだと未設定でも 0 が入るため、このエラーは出ずに「重複キー」エラーや既存行の上書きとして表面化することがある。ID はラッパー型(Long/Integer)にすると未設定を null で判別できる GenerationType.AUTOの挙動: Hibernate 5 以降を MySQL で使うと、AUTO がhibernate_sequenceテーブルを使う方式になることがある。AUTO_INCREMENT を使いたいなら IDENTITY を明示するのが確実- IDENTITY とバッチ INSERT: IDENTITY は INSERT するまで ID が分からないため、Hibernate の JDBC バッチ INSERT が効かなくなる。大量登録が多いならシーケンス方式を検討する
- 複合主キー: 複合キー(
<composite-id>/@EmbeddedId)は自動採番できないため、各キー項目をアプリ側で必ず代入する
確認方法
- 例外メッセージ末尾のクラス名から、対象エンティティを特定する
- そのエンティティの hbm.xml(
<id>内の<generator>)または@Id周辺のアノテーションを確認する - DB の DDL(
SHOW CREATE TABLE テーブル名;など)で、ID 列に AUTO_INCREMENT やシーケンスの既定値があるか確認する hibernate.show_sql=trueで発行される INSERT 文を表示し、ID 列が含まれるか・値が入っているかを見る
関連
- Hibernate とは|Java の ORM ライブラリと JPA 参照実装の基礎
- 【Spring】@Id アノテーションとは
- 【Spring】@GeneratedValue アノテーションとは
- MySQL AUTO_INCREMENT 完全ガイド
- 【Spring エラー】No identifier specified for entity
子ページはありません
- ids for this class must be manually assigned before calling save()
- Number of positional parameter types (1 does not match number of positional parameters (2)
- net.sf.hibernate.MappingException: No persister for ~
- net.sf.hibernate.QueryException: unexpected token: as [~]
- net.sf.hibernate.MappingException: Error reading resource
- IllegalArgumentException occurred while calling setter of
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- djangoのテンプレートの作成とヘッダー・フッターの共通化 2026-10-03 21:41:49
- テンプレートフラグメント(ヘッダー等の共有化) 2026-10-03 21:41:49
- reCAPTCHA v3 使い方(サンプル付き) 2026-10-03 21:37:05
- Content-Type一覧|MIMEタイプとはとHTTPでの主な使用場面 2026-10-03 21:37:05
- SpringにおけるAOPの使い方 2026-10-03 21:37:05
- X (Twitter) API でツイートできないがエラーが出ない問題の原因と対処 2026-10-03 11:33:01
- X (Twitter) API アプリケーション登録完全ガイド|v2・Bearer Token・OAuth 2.0 PKCE 2026-10-03 11:33:01
- X (Twitter) API 完全ガイド|従量課金の料金・単価(2026年10月)と v2 移行 2026-10-03 11:32:40
- Google DeepMind とは?Gemini・AlphaFold の開発元 2026-10-03 11:26:56
- Cursor とは?AI 統合型コードエディタの使い方・料金 2026-10-03 11:26:56
- Claude (Anthropic) とは?AIチャットの使い方・モデルファミリ・API 2026-10-03 11:26:56
- AIベンダー一覧:OpenAI・Anthropic・Google DeepMind・Microsoft・Meta 2026-10-03 11:26:56
- クラウド・インフラ完全ガイド — AWS/Azure/GCP/Kubernetes 2026-10-03 11:26:56
- テキストエディタ完全比較 (VS Code / Cursor / Vim / Emacs / IDE) 2026-10-03 11:26:56
- プログラミング学習プラットフォーム|Scratch・micro:bit ほか 2026-10-03 11:26:56