Hibernate关系加载

时间:2015-10-27 17:26:44

标签: java spring hibernate tomcat struts2

我正在开发一个Struts2 + Hibernate + Spring应用程序。我试图将用户权限加载到我的会话中,以便将它们恢复到特定的jsp中。

工作流程就是这个:

  1. 用户登录
  2. 用户组由hibernate急切加载
  3. 以下是User类的代码。

    @JoinColumn(name = "id_user_group", referencedColumnName = "id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY, targetEntity = UserGroup.class)
    public UserGroup getUserGroup() {
        return userGroup;
    }
    
    1. 从用户组中恢复另一个EAGER关系
    2. 以下是UserGroup class

      的代码
      @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
      @JoinTable(name = "user_section_permission", joinColumns = {
          @JoinColumn(name = "id_user_group", nullable = false, updatable = false)},
              inverseJoinColumns = {
                  @JoinColumn(name = "id_section_permission",
                          nullable = false, updatable = false)})
      public List<SectionPermission> getSectionPermissions() {
          return sectionPermissions;
      }
      
      1. 用户已保存到会话中。当登录操作将用户重定向到其仪表板时,将调用refreshPermissions方法
      2. 以下是代码:

        UserGroup userGroup = ((User) session.get("user")).getUserGroup();
        
            Map<String, Section> permissions = new HashMap<>();
            List<SectionPermission> sectionPermissions = userGroup.getSectionPermissions();
            for (SectionPermission sectionPermission : sectionPermissions) {
                permissions.put(sectionPermission.getCode(), sectionPermission.getSection());
            }
            session.put("permissions", permissions);
        

        我认为我很容易理解,我只是使用权限代码及其相关部分创建地图(为了填充菜单等等。

        现在问题是......我的tomcat将权限属性显示为空

        Tomcat manager image

        但奇怪的是,如果我在for循环中添加LOG.debug("Perm: {}", new Object[]{sectionPermission.getCode(), sectionPermission.getSection()});,那么权限就会出现......

        Tomcat manager image

        发生了什么?我在使用Hibernate或Spring做错了吗?

1 个答案:

答案 0 :(得分:1)

您正在使用延迟加载,因此在您引用权限之前,权限不会被加载。这发生在记录行中。