【问题标题】:Hibernate relation loading休眠关系加载
【发布时间】:2016-01-27 06:11:27
【问题描述】:

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

工作流程是这样的:

  1. 用户登录
  2. 用户组由休眠急切加载

这是来自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 关系

这是来自UserGroup类的代码

@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 方法

代码如下:

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显示权限属性为空

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

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

【问题讨论】:

    标签: java spring hibernate tomcat struts2


    【解决方案1】:

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

    【讨论】:

    • 我正在编辑我的问题,写 getSection 有一个 LAZY fetch 类型......但我想尽可能保持惰性......你知道我如何在需要时初始化它们,比如这个例子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2015-07-21
    相关资源
    最近更新 更多