| この記事の要点 |
|
エラー内容
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・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09