一)双向多对多的配置
1.1):配置多对多
需求角色拥有多个菜单,菜单属于多个角色
使用到的注解@ManyToMany
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ManyToMany {
Class targetEntity() default void.class; //目标类,指得是关联的目标类
CascadeType[] cascade() default {};//级联策略
FetchType fetch() default FetchType.LAZY;//加载策略
String mappedBy() default "";//映射
}
菜单实体
@Entity
@Table(name = "t_menu")
public class Menu {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "menuid")
private Integer menuid;
@Column(name = "menuName")
private String menuName;
@ManyToMany(mappedBy = "menuSet")
private Set<Roles> rolesSet = new HashSet<>();
角色实体
注解@ManyToMany。@JoinTable
多对多使用中间表进行连接,@JoinTable注解就是设置中间表的注解,@JoinTable注解可以出现在两个多方的任意一个当中
@JoinTable需要三个主要的属性
1.name:中间表的名称
2.joinColumns :当前表存在中间表的外键名称
3.inverseJoinColumns 另一张多方存在中间表的名称
@Entity
@Table(name = "t_roles")
@Lazy(false)
public class Roles {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "roleid")
private Integer roleid;
@Column(name = "roleName")
private String roleName;
/**
* 一对多的配置
*/
@OneToMany(mappedBy = "roles",fetch = FetchType.EAGER)
private Set<Users> usersSet = new HashSet<>();
/**
* 多对多配置:注解可以出现在两个多方实体的任意一个中,那么根据此案例中,在配置就要和当前的配置反过来
* 使用注解@JoinTable : name:指定中间表的名称
* joinColumns:当前多方存在中间表中的外键名称
* inverseJoinColumns:另一个多方的存在中间表的外键名称
*/
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "role_menu",joinColumns = @JoinColumn(name = "role_id"),inverseJoinColumns = @JoinColumn(name = "menu_id"))
private Set<Menu> menuSet = new HashSet<>();
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ApplicationContext-hib.xml")
public class TestManyToMany {
@Autowired
private RoleDao roleDao;
@Test
public void test2(){
Roles one = this.roleDao.findOne(5);
System.out.println(one);
one.getMenuSet().stream().forEach(System.out::println);
}
@Test
public void test1(){
Roles roles = new Roles();
roles.setRoleName("SuperManager");
Menu menu = new Menu();
menu.setMenuName("PageManager");
Menu menu1 = new Menu();
menu.setMenuName("PesonManager");
//建立关系
roles.getMenuSet().add(menu);
roles.getMenuSet().add(menu1);
menu.getRolesSet().add(roles);
//通过角色关联操作菜单
this.roleDao.save(roles);
}
}