2016-11-07 4 views
0

Я новичок в зимнем режиме. Я использую следующий код, чтобы получить мой объектHibernate stop lazy loading

@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, но при этом так, спящий режим запросов БД снова

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.JOIN) на .setFetchMode("skillChecklist", FetchMode.EAGER)

+0

это не работает – coder310

+0

пытаться заменить .setFetchMode ("skillChecklist", FetchMode.JOIN) по .setFetchMode ("skillChecklist", FetchMode.EAGER) – chomnoue