Hibernate停止延迟加载

时间:2016-11-07 17:54:18

标签: java spring hibernate

我是hibernate的新手。 我使用下面的代码来获取我的对象

@Transactional(readOnly = true,propagation=Propagation.NEVER)
public StaffSkillChecklist listSkillMatrixByChecklistIdForStaff(Long checklistid, Long staffId) {

    StaffSkillChecklist sc = (StaffSkillChecklist) em.unwrap(Session.class)
            .createCriteria(StaffSkillChecklist.class, "staffchecklist")
            .createAlias("staffchecklist.staffSkillRatingSet", "staffSkillRating", JoinType.LEFT_OUTER_JOIN)
            .setFetchMode("staffSkillRating", FetchMode.JOIN)

            .createAlias("staffchecklist.skillChecklist", "skillChecklist", JoinType.LEFT_OUTER_JOIN)
            .setFetchMode("skillChecklist", FetchMode.JOIN)

            .createAlias("staffSkillRating.skillGroup", "skillGroup", JoinType.LEFT_OUTER_JOIN)
            .setFetchMode("skillGroup", FetchMode.JOIN)
            .createAlias("staffSkillRating.skill", "skill", JoinType.LEFT_OUTER_JOIN)
            .setFetchMode("skill", FetchMode.JOIN)
            .createAlias("staffSkillRating.skillRating", "skillRating", JoinType.LEFT_OUTER_JOIN)
            .setFetchMode("skillRating", FetchMode.JOIN).addOrder(org.hibernate.criterion.Order.asc("id"))

            .add(Restrictions.and(Restrictions.eq("staffchecklist.staff.id", staffId),
                    Restrictions.eq("skillChecklist.id", checklistid)))
            .uniqueResult();

    return sc;
}

现在在我的serviceclass中,我需要迭代对象并转换为DTO但是这样做,hibernate再次查询db

public SkillChecklistDTO toDTO(SkillChecklist skillChecklist, int depth) {
        if (skillChecklist == null) {
            return null;
        }

        Set<SkillChecklistGroup> scgList = new HashSet<SkillChecklistGroup>();
//HIBERNATE WILL FIRE A QUERY again
        scgList = skillChecklist.getChecklistGroups();

        return dto;
    }

如何阻止hibernate再次触发查询。我的第一个查询包含了我想要的一切。

1 个答案:

答案 0 :(得分:0)

默认情况下,Hybernate在OneToMany关系上应用延迟加载。 因此,您应该在注释中添加fetch = FetchType.EAGER。

@OneToMany(fetch = FetchType.EAGER)

您还应尝试将.setFetchMode("skillChecklist", FetchMode.JOIN)替换为.setFetchMode("skillChecklist", FetchMode.EAGER)