ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Hibernate でよくあるエラー一覧
| 例外 | 主な原因 | 対処 |
|---|---|---|
| MappingException | アノテーション/XML設定ミス | テーブル列名 / 型 / @Id 確認 |
| LazyInitializationException | Session 閉じ後の Lazy アクセス | @Transactional 範囲拡大 / FETCH JOIN |
| NonUniqueObjectException | 同 ID Entity を同 Session に重複登録 | merge() で更新 or evict() |
| StaleObjectStateException | 楽観ロック (@Version) で版違い | リトライ / 競合解消 UI |
| ConstraintViolationException | NotNull / Unique / 外部キー違反 | バリデーション / DB エラー扱い |
| HibernateException (汎用) | Connection / Session 不正 | スタックトレース確認 |
| TransactionRequiredException | update/delete を tx 外で実行 | @Transactional 付与 |
| QuerySyntaxException | JPQL / HQL の構文ミス | クエリ修正、エンティティ名確認 |
1. MappingException
org.hibernate.MappingException: Could not determine type for: java.util.List,
at table: user, for columns: [org.hibernate.mapping.Column(roles)]
原因: List<Role> 等のコレクションに @OneToMany / @ManyToMany を付け忘れた。
// ❌
private List<Role> roles;
// ✅
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Role> roles;
2. LazyInitializationException
org.hibernate.LazyInitializationException:
could not initialize proxy [User#42] - no Session
原因: Session が閉じた後で Lazy ロード対象(@OneToMany / @ManyToOne Lazy)にアクセス。よくあるのは Controller でレスポンス JSON 化中に発生。
// ❌ Controller (Session 終了済) で Lazy 取得 → 例外
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
User user = userRepository.findById(id).orElseThrow();
return user; // user.getRoles() を JSON 化中に LazyInit
}
// ✅ 対処1: @Transactional でメソッド全体を tx に
@Transactional(readOnly = true)
@GetMapping("/{id}")
public UserDto get(@PathVariable Long id) {
User user = userRepository.findById(id).orElseThrow();
return new UserDto(user, user.getRoles());
}
// ✅ 対処2: FETCH JOIN で先読み
@Query("SELECT u FROM User u JOIN FETCH u.roles WHERE u.id = :id")
Optional<User> findByIdWithRoles(@Param("id") Long id);
// ✅ 対処3: EntityGraph
@EntityGraph(attributePaths = {"roles"})
Optional<User> findById(Long id);
// ✅ 対処4: DTO Projection で必要列だけ取得
@Query("SELECT new com.app.UserDto(u.name, r.name) FROM User u JOIN u.roles r")
List<UserDto> findAllAsDto();
3. NonUniqueObjectException
org.hibernate.NonUniqueObjectException:
A different object with the same identifier value was already
associated with the session : [User#42]
原因: 同じ ID の Entity を同じ Session に 2 つ登録。save() で新しい instance を渡したが、既に Session 内で別 instance が管理されている。
// ❌ 別 instance を save
User u1 = userRepository.findById(42L).get(); // managed
User u2 = new User(42L, "renamed");
userRepository.save(u2); // → NonUniqueObjectException
// ✅ merge() を使う
userRepository.save(u2); // JPA save は merge と同等
// または明示的に
entityManager.merge(u2);
4. StaleObjectStateException (楽観ロック)
org.hibernate.StaleObjectStateException:
Row was updated or deleted by another transaction
(or unsaved-value mapping was incorrect) : [User#42]
原因: @Version 楽観ロックで他 tx が先に更新したのを検知。
@Entity
public class User {
@Id Long id;
String name;
@Version
Long version; // ★ Hibernate が自動 +1 / UPDATE 時に WHERE で照合
}
// 対処: リトライ
@Retryable(value = ObjectOptimisticLockingFailureException.class, maxAttempts = 3)
public void update(Long id, String name) {
User u = userRepository.findById(id).get();
u.setName(name);
userRepository.save(u);
}
// または UI で「他の人が更新しました。リロードしてください」を出す
5. ConstraintViolationException
org.hibernate.exception.ConstraintViolationException:
could not execute statement
... Duplicate entry 'taro@example.com' for key 'user.uk_email'
原因: DB の UNIQUE / NOT NULL / FOREIGN KEY 制約違反。Bean Validation で同じ名前のクラスもあるので注意。
try {
userRepository.save(new User(email, name));
} catch (DataIntegrityViolationException e) {
// メールアドレス重複として 422 を返す
throw new EmailAlreadyUsedException(email);
}
6. N+1 問題(エラーではないが致命的遅延)
// ❌ N+1: User 1 件 + Roles N 件で N+1 クエリ
List<User> users = userRepository.findAll(); // SELECT * FROM user
for (User u : users) {
System.out.println(u.getRoles().size()); // SELECT * FROM role WHERE user_id=? を N 回
}
// ✅ JOIN FETCH で 1 クエリ
@Query("SELECT u FROM User u JOIN FETCH u.roles")
List<User> findAllWithRoles();
// ✅ EntityGraph
@EntityGraph(attributePaths = {"roles"})
List<User> findAll();
// ✅ BatchSize で SELECT IN
@OneToMany
@BatchSize(size = 100)
private List<Role> roles;
デバッグ Tips
# application.properties
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.orm.jdbc.bind=TRACE
logging.level.org.springframework.transaction=DEBUG
# 統計: 何クエリ発行したか
spring.jpa.properties.hibernate.generate_statistics=true
FAQ
Q: @Transactional を付けると LazyInit が出ない理由
A: @Transactional の範囲では Session が生存するため。OSIV (Open Session In View) パターンも同じ仕組みだが、controllers でクエリが発火するのでアンチパターン扱い。
Q: save したのに DB に反映されない
A: tx をコミットしていない / flush していない / catch でロールバック中。@Transactional の境界とログを確認。
Q: Hibernate 6 と 5 で挙動が違うエラー
A: Hibernate 6 は Jakarta EE に移行しjavax.persistence → jakarta.persistence。アノテーションの import エラーが大量に出る。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
- 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 と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?