Hibernate @ManyToMany supprimer la relation
J'ai 2 entités: l'Utilisateur et le UsersList.
@Entity
@Table(name = "USERS")
public class User {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@ManyToMany(cascade = CascadeType.REMOVE, mappedBy = "users")
private List<UsersList> usersLists = new ArrayList<UsersList>();
public List<UsersList> getUsersLists() {
return usersLists;
}
public void setUsersLists(List<UsersList> usersLists) {
this.usersLists = usersLists;
}
}
et
@Entity
@Table(name = "USERS_LIST")
public class UsersList {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@ManyToMany
private List<User> users = new ArrayList<User>();
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
et un code comme celui-ci:
//1
List<User> dbUsers; //3 the user instances are persisted in DB
UsersList usersList = new UsersList();
usersList.setUsers(dbUsers);
//2 - now persist the usersList using hibernate...
saveWithHibernate(usersList);
//3 - delete using a persisted user
deleteWithHibernate(dbUsers.get(0).getId());
où
deleteWithHibernate(Long id) {
User usr = hibernateTemplate.get(User.class, id);
hibernateTemplate.delete(usr);
}
À l'étape 1, j'ai 3 lignes dans les UTILISATEURS (USER_ID) de la table.
Après l'étape 2 (deuxième commentaire) j'ai 1 ligne dans la USERS_LIST (USERS_LIST_ID) table et dans la table de jointure USERS_LIST_USERS (USER_ID, USERS_LIST_ID) 3 lignes.
Ce que je veux réaliser dans l'étape 3 est le suivant: quand je supprime un utilisateur à partir de la table des UTILISATEURS, disons - utilisateur avec USER_ID = 4, je veux juste la ligne avec USER_ID = 4 à partir de la table de jointure pour être supprimés, et les autres à rester.
Est-il une annotation de solution à mon problème?
OriginalL'auteur Flueras Bogdan | 2009-08-19
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez besoin est la @JoinTable attribut:
Hibernate ne savent pas que les plusieurs-à-plusieurs relations se référer les uns aux autres et va probablement créer deux tables de jointure. Si vous spécifiez le même @JoinTable sur les deux côtés de la relation qu'elle fonctionne comme prévu.
Assurez-vous que le joinColumn et la inverseJoinColumn sont opposés sur la partie opposée de la
les côtés de la relation.
J'espère que cette aide.
l'OP utilise
mappedBy
, n'est-ce pas assez pour hibernate pour savoir ce que l'@JoinTable
devrait ressembler? Une liste explicite des@JoinTable
nom et colonnes semble un peu superflu, sauf si vous voulez vraiment vous assurer que vos noms exacts sont utilisés.Excellente solution !
OriginalL'auteur andersjanmyr
Je pense qu'il faut que ce annotaion
et changement cascade.supprimer pour CascadeType.TOUS
votre code doit être quelque chose comme ceci
OriginalL'auteur Am1rr3zA