1. ホーム
  2. hibernate

PersistentObjectException: 永続化例外に渡された離脱したエンティティ

2022-02-12 23:42:26
<パス

迷子のオブジェクトを永続化(保存)する場合のエラーを見るだけでよい。
オブジェクトを永続化するために、通常HibernateはID生成ポリシーに従って自動的にID値を生成することが分かっていますが、このオブジェクトIDはすでに値を持っているため、すべてエラーをスローします。このエラーは、次のような1対多の@OneToManyの関連付けの関係を構成したときに発生します。


@OneToMany(targetEntity = Role.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "sys_user_role", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id", unique = true))
private Set<Role> roles = new HashSet<>();
カスケード関係がCascadeType.ALLなので、saveするとカスケード・オブジェクトRoleが保存されますが、Roleはすでに存在しているので、エラーが報告されます。cascadeをCascadeType.MERGEまたはCascadeType.REFRESHに変更し、カスケード・オブジェクトがRoleテーブルに存在することを示し、更新は行いますが、保存は行わないようにします。 CascadeType.ALLは、カスケード操作の際に注意して使用します。