やあ、
次のように、多対多の関係を持つユーザーとロールのモデルがあります
@Entity
@Table(name = "USER")
@Indexed
@XmlRootElement
public class User extends BaseObject implements Serializable, UserDetails, PersistentObject, HasRevision, org.activiti.engine.identity.User {
private Set<Role> roles = new HashSet<Role>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "USER_ROLE",
joinColumns = { @JoinColumn(name = "USER_ID") },
inverseJoinColumns = @JoinColumn(name = "ROLE_ID")
)
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
@Entity
@Table(name = "ROLE")
@NamedQueries({
@NamedQuery(
name = "findRoleByName",
query = "select r from Role r where r.name = :name "
)
})
public class Role extends BaseObject implements Serializable, GrantedAuthority {
private Set<User> users = new HashSet<User>();
@ManyToMany(fetch = FetchType.EAGER,mappedBy = "roles")
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
ロールを割り当ててユーザーを作成または更新すると、例外は次のようになります
ユーザーの id: ユーザー org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: 識別子 [user] を持つクラス [com.model.User] のオブジェクト: 楽観的ロックに失敗しました。ネストされた例外は org.hibernate.StaleObjectStateException: 行が別のトランザクションによって更新または削除されました (または保存されていない値のマッピングが正しくありません): [com.model.User#user] ....
原因: org.hibernate.StaleObjectStateException: 行が別のトランザクションによって更新または削除されました (または、保存されていない値のマッピングが正しくありませんでした): [com.model.User#user]
熱心なフェッチの代わりに遅延を置くことはできません。他の問題(セッションからロールを取得できない場所)が発生し、ロールの削除で発生する逆の関係を削除できません。
問題の提案をどのように解決するかを歓迎し、事前に感謝します。