SpringDataJPA-关联关系查询-操作多对多关联关系

一)双向多对多的配置

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值