0

やあ、

次のように、多対多の関係を持つユーザーとロールのモデルがあります

@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]

熱心なフェッチの代わりに遅延を置くことはできません。他の問題(セッションからロールを取得できない場所)が発生し、ロールの削除で発生する逆の関係を削除できません。

問題の提案をどのように解決するかを歓迎し、事前に感謝します。

4

0 に答える 0