----------------------多对多manytomany 要点: 多对多必须有mappedBy,让一个端维护关系 多对多会创建一张关系表,维护关系就是维护第三张表。 所以增加关系,则在集合中添加实体。删除关系,则从集合中删除实体。 mappedBy使一方丧失关系维护 @Entity public class User { @Id @GeneratedValue private long id; @Column(name="name") private String name; @ManyToMany(mappedBy="users") @Cascade(value=CascadeType.SAVE_UPDATE) private Set<Role> roles = new HashSet<Role>(); } @Entity public class Role { @Id @GeneratedValue private long id; @Column private String name; @ManyToMany private Set<User> users = new HashSet<User>(); public String getName() { return name; } --------------------------------保存mappedBy端 User user = new User(); user.setName("zhangsan"); User user2 = new User(); user2.setName("lisi"); Role r1= new Role(); r1.setName("ADMIN"); Role r2= new Role(); r2.setName("EDITOR"); user.getRoles().add(r1); user.getRoles().add(r2); user2.getRoles().add(r1); r1.getUsers().add(user); r1.getUsers().add(user2); r2.getUsers().add(user); session.save(user); session.save(user2); 结果:
进行了级联保存。
如果使用
CascadeType.PERSIST注解
@ManyToMany(cascade=CascadeType.PERSIST,mappedBy="users") 则需要调用session.persist方法进行保存。注意每个方法上都有支持的级联注解的说明!
Hibernate: insert into User (name, id) values (?, ?) Hibernate: insert into Role (name, id) values (?, ?) Hibernate: insert into Role (name, id) values (?, ?) Hibernate: insert into User (name, id) values (?, ?) Hibernate: insert into Role_User (roles_id, users_id) values (?, ?) Hibernate: insert into Role_User (roles_id, users_id) values (?, ?) Hibernate: insert into Role_User (roles_id, users_id) values (?, ?) 删除用户139的ADMIN权限 User u = session.get(User.class,139L); Set<Role> roles = u.getRoles(); Iterator<Role> ites = roles.iterator(); while(ites.hasNext()) { Role r = ites.next(); if(r.getName().equals("ADMIN")){ r.getUsers().remove(u);//执行成功,删除关系,而不删除用户 //u.getRoles().remove(r);//执行失败,关系它不维护 } }