多对多manytomany

----------------------多对多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);//执行失败,关系它不维护 } }

  

原文地址:https://www.cnblogs.com/beenupper/p/6818715.html