有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

尝试分配哈希集时,java LazyInitializationException出现异常

 private Set<Employee> assignees = new HashSet<>();  



 public Set<Employee> getAssignees() {
            return assignees;
        }

        public void setAssignees(Set<Employee> assignees) {
            this.assignees = assignees;
        } 

我在下面的代码中使用了上述方法,当运行该代码时,我得到了这个异常

 `Resolved exception caused by Handler execution: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:`

它来自于执行死刑 agendaInfo.setAssignees(item.getAssignees());行。 为什么会有这样的解释

@Override
        public List<AgendaContentDTO> getAgendasByMeetingId(Long meetingId) {

            List<Agenda_content> agendas = extendedAgendaContentRepository.getAgendasByMeetingId(meetingId);
            List<AgendaContentDTO> agendaDTOS = new ArrayList<>();

            Long currentUser = utils.getCurrentEmployeeId();

            for (Agenda_content item: agendas){

                AgendaContentDTO agendaInfo = new AgendaContentDTO();

                agendaInfo.setId(item.getId());
                agendaInfo.setTitle(item.getTitle());
                agendaInfo.setContent(item.getContent());
                agendaInfo.setMeetingId(item.getMeeting().getId());
                agendaInfo.setMeetingMeetingName(item.getMeeting().getMeetingName());
                agendaInfo.setAssignees(item.getAssignees());

              agendaDTOS.add(agendaInfo);
            }
            return agendaDTOS;
        }

public interface ExtendedAgendaContentRepository extends Agenda_contentRepository {

    @Query("select distinct e.meeting from Agenda_content e join e.assignees a where a.id =:assigneeId")
    public List<Meeting> getMeetingsAssignedToMe(@Param("assigneeId") long assigneeId);

    @Query("select distinct e from Agenda_content e where e.meeting.id =:meetingId")
    public List<Agenda_content> getAgendasByMeetingId(@Param("meetingId") long meetingId);


}

共 (1) 个答案

  1. # 1 楼答案

    集合在hibernate中是延迟加载的,因此当您从getAgendasByMeetingId加载数据时,hibernate加载议程内容列表,但不加载集合(被分配者)

    LazyInitializationException正在加速,因为您的系统中没有可用的事务(没有打开的会话) public List<AgendaContentDTO> getAgendasByMeetingId(Long meetingId) {代码

    如果您使用的是spring,那么用@Transaction标记您的方法 或者在hibernate中,您需要打开一个会话

    或者可以使用fetchType=fetchType。渴望你的收藏,所以在加载内容时休眠加载所有GetAssignee