Zoe_ 2015-06-24 09:07 采纳率: 0%
浏览 1511

Hibernate JPA 配置多对多问题

SysUser.java

@ManyToMany(fetch = FetchType.EAGER, targetEntity = SysRole.class)
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinTable(name = "SYS_USER_ROLE", 
        joinColumns={ @JoinColumn(name="USER_ID",referencedColumnName="ID")},
        inverseJoinColumns={@JoinColumn(name="ROLE_ID",referencedColumnName="ID")})
private Set<SysRole> roles;

** SysRole.java**

    @ManyToMany(fetch = FetchType.EAGER, targetEntity = SysMenu.class)
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinTable(name = "SYS_ROLE_MENU", schema="VIDS",
        joinColumns = { @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID") }, 
        inverseJoinColumns = { @JoinColumn(name = "MENU_NAME", referencedColumnName = "MENU_NAME") })
private Set<SysMenu> menus;
以上就是我的所有配置
测试:
UserService userService  =  (UserService)SpringContextUtils.getBean("userService");
    SysUser user = userService.getUserByUsername("zhangsan");
    System.out.print(":::::"+user.getUserName()+"\t");
    Iterator<SysRole> roles = user.getRoles().iterator();
    while (roles.hasNext()) {
        SysRole role = roles.next();
        System.out.print(role.getName()+"\t");
            Iterator<SysMenu> menus = role.getMenus().iterator();
            while (menus.hasNext()) {
                SysMenu menu = menus.next();
                System.out.print(menu.getName()+"\t");
            }
            System.out.println();
        }
    }

    输出结果
    :::::zhangsan   admin   
    为毛menus取不到?
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-04 01:00
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在使用Hibernate和JPA时,如果你想要查询一个实体对象的关联关系(比如一对多或一对一),你需要使用@ManyToOne@OneToMany等注解。对于多对多的关系,通常需要通过设置fetch属性为EAGER或者LAZY来决定如何加载这些关联的数据。

    首先,你的SysUser类中没有正确地设置fetch属性为EAGER,这会导致Iterator<SysRole>无法获取到Iterator<SysMenu>。正确的做法应该是:

    @ManyToMany(fetch = FetchType.LAZY, targetEntity = SysRole.class)
    

    然后,在UserService类中,你可以在调用getUserByUsername方法之前添加以下代码来设置fetch属性为EAGER

    Set<SysRole> roles = userService.getUserByUsername("zhangsan").getRoles();
    

    现在,当执行Iterator<SysRole>迭代器时,它应该能成功获取到Iterator<SysMenu>。如果仍然遇到问题,请检查数据库连接是否正常,并确保数据库中的数据已经更新。

    此外,如果你发现menus集合始终为空,可能是因为你在调用getUserByUsername方法后,没有及时更新roles集合。你可以考虑将roles变量与userService.getUserByUsername方法的结果绑定在一起,这样就可以自动更新roles集合了。

    public Set<SysRole> getUserByUsername(String username) {
        return userService.getUserByUsername(username).getRoles();
    }
    
    评论

报告相同问题?