2010-06-14 4 views
0

J'ai deux tables liées dans une relation plusieurs à plusieurs: Role et Permission. La table de jointure est RolePermission. L'objet Role a une liste d'autorisations. il ressemble à ceci:NonUniqueObjectException lors de l'enregistrement des tables jointes

private Set<Permission> Permissions;  

@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) 
@JoinTable(name = "permission_role", joinColumns = @JoinColumn(name = "role_id"), 
      inverseJoinColumns = @JoinColumn(name = "permission_id")) 
public Set<ObjectPermission> getObjectPermissions() { 
    return objectPermissions; 
} 

Dans un certain temps, je veux ajouter des autorisations à un rôle:

role.getObjectPermissions().add(permission); 
roleDAO.saveOrUpdate(role); 

Tant le rôle et l'autorisation existent déjà dans la db, chacun dans sa table. Je veux ajouter un enregistrement à la table de relation, qui pointera à la fois sur le rôle et l'autorisation:

role.addObjectEntryPermissionRole(permission); 
roleDAO.saveOrUpdate(role); 

Le problème est qu'il semble que cela essaie de sauver l'autorisation elle-même! Alors il jette cette erreur:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.XXX.model.Permission#11] 

Quelqu'un pourrait me dire quel est le problème? Qu'ai-je fait de mal?

+0

à quoi ressemble la méthode addObjectEntryPermissionRole? Les objets Rôle ou Permission sont-ils détachés (les avez-vous obtenus lors d'une autre session d'hibernation?)? – Thierry

+0

Je ne comprends pas les deux extraits de code. Appelez-vous les deux? Aussi, quel est le contenu de 'addObjectEntryPermissionRole'? –

Répondre

0

J'ai eu le même problème. La suppression de cascade = { CascadeType.ALL } a résolu le problème.

Questions connexes