级联操作
多对多的级联操作同一对多和多对一是一样的。如果只保存单独的一方是不可以的,还是需要保存双方的。如果想保存一方就需要设置级联操作。同样需要设置主控方。
创建表
创建sys_user、sys_role、sys_user_role三张表:
创建实体
User:
public class User {
//主键
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private Character user_state;
//表达多对多
private Set<Role> roles = new HashSet<Role>();
public Long getUser_id() {
return user_id;
}
public void setUser_id(Long user_id) {
this.user_id = user_id;
}
public String getUser_code() {
return user_code;
}
public void setUser_code(String user_code) {
this.user_code = user_code;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
public Character getUser_state() {
return user_state;
}
public void setUser_state(Character user_state) {
this.user_state = user_state;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
Role:
//角色对象
public class Role {
//主键
private Long role_id;
private String role_name;
private String role_memo;
//表达多对多
private Set<User> users = new HashSet<User>();
public Long getRole_id() {
return role_id;
}
public void setRole_id(Long role_id) {
this.role_id = role_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_memo() {
return role_memo;
}
public void setRole_memo(String role_memo) {
this.role_memo = role_memo;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
级联保存或更新
保存用户级联角色:
保存的主控方是用户,需要在用户一端配置:
<!-- save-update 级联更新 -->
<set name="roles" table="sys_user_role" cascade="save-update" >
<key column="user_id" ></key>
<many-to-many class="Role" column="role_id" ></many-to-many>
</set>
测试:
@Test
//保存用户以及角色
public void fun1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//创建User
User u1 = new User();
u1.setUser_name("小明");
//创建两个 Role
Role r1 = new Role();
r1.setRole_name("保洁");
Role r2 = new Role();
r2.setRole_name("保安");
//用户表达关系(因为是由用户维护多对多关系,所以只需要写这一边)
u1.getRoles().add(r1);
u1.getRoles().add(r2);
//调用Save方法级联保存
session.save(u1);
//-------------------------------------------------
tx.commit();
session.close();
}
保存角色级联用户:
保存的主控方是角色,就需要在角色一端配置:
<set name="users" table="sys_user_role" inverse="true" cascade="savv-update">
<key column="role_id" ></key>
<many-to-many class="User" column="user_id" ></many-to-many>
</set>
测试:
@Test
//保存角色级联用户
public void fun1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//---------------------------------------------
//创建User
User u1 = new User();
u1.setUser_name("二狗子");
//创建Role
Role r1 = new Role();
r1.setRole_name("社会闲散人员");
u1.getRoles().add(r1);
r1.getUsers().add(u1);
//调用Save方法级联保存
session.save(r1);
//---------------------------------------------
tx.commit();
session.close();
}
级联删除
删除用户级联删除角色:
主控方是用户,所以需要在用户一端配置:
<set name="roles" table="sys_user_role" cascade="delete" >
<key column="user_id" ></key>
<many-to-many class="Role" column="role_id" ></many-to-many>
</set>
测试:
@Test
//删除二狗子和关联的角色
public void fun4(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//---------------------------------------------
//获得用户,二狗子
User user = session.get(User.class, 11l);
//级联删除(二狗子与社会闲散人员一同删除)
session.delete(user);
//---------------------------------------------
tx.commit();
session.close();
}