2016-11-07 175 views
0

我是新的休眠。 我用下面的代碼讓我的對象休眠停止延遲加載

@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; 
} 

現在在我的服務類,我需要遍歷對象,並轉換爲DTO,但在這樣做時,Hibernate查詢數據庫再次

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; 
    } 

如何我是否會停止再次發起查詢的休眠。我的第一個查詢具有我想要的一切。

回答

0

默認情況下,Hybernate對OneToMany關係應用延遲加載。 所以你應該添加fetch = FetchType.EAGER到你的註釋中。

@OneToMany(fetch = FetchType.EAGER) 

你也應該嘗試通過.setFetchMode("skillChecklist", FetchMode.EAGER)

+0

更換.setFetchMode("skillChecklist", FetchMode.JOIN)這不起作用 – coder310

+0

嘗試.setFetchMode更換.setFetchMode( 「skillChecklist」,FetchMode.JOIN)語句( 「skillChecklist」,FetchMode.EAGER) – chomnoue