Tem alguém para ajudar? "tcc" LazyInitializationException com picklist e com busca separada da outra entidade

Boa Noite pessoal estou com um problema no meu tcc tenho uma semana para entregar então help me.
é um projeto de um sistema de comunicação acadêmico estou preso na tela da turma que tem uma relação muito para muitos com usuários do tipo alunos que precisa ser inseridos por um picklist mas não consigo fazer inserir, excluir e editar.
No manageBean coloquei uma busca para turma e uma para alunos que as vezes funciona retorna LazyInitializationException e as vezes não e o problema da tela de cadastro/edição é carregar os alunos que já foram inseridos sem ter erros como java.lang.ClassCastException: com.universidadez.tcc.universidade.model.Turma cannot be cast to java.util.List
Irei colocar o código.

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p=“http://primefaces.org/ui"
template=”/WEB-INF/templates/LayoutAluno.xhtml"
xmlns:o=“http://omnifaces.org/ui”>

<ui:define name="content">
	<h1 class="aw-page-title">Lista de Turmas</h1>


	<h:form id="frm2">
	
		<f:metadata>
			<f:viewAction action="#{turmaBean.lista}" />
		</f:metadata>
		<p:messages id="messages" autoUpdate="true" closable="true" />

		<p:toolbar style="margin-top: 20px">
			<p:toolbarGroup>
				<p:button title="Criar uma Turma" value="Novo"
					outcome="/turma/TurmaCadastro.xhtml" />
			</p:toolbarGroup>
		</p:toolbar>


		<p:dataTable id="turmaTable"
			value="#{turmaBean.turmas}" var="turma"
			emptyMessage="Nenhuma turma encontrada." reflow="true"
			style="margin-top: 10px" rows="10" paginator="true"
			paginatorPosition="bottom">

			<p:column headerText="Id" sortBy="#{turma.id}">
				<h:outputText value="#{turma.id}" />
			</p:column>
			<p:column headerText="Professor" sortBy="#{turma.professor.id}">
				<h:outputText value="#{turma.professor.nome}" />
			</p:column>
			
			
			<p:column headerText="Numero" sortBy="#{turma.numero}">
				<h:outputText value="#{turma.numero}" />
			</p:column>

			<p:column headerText="Alunos"
				style="width: 100px; text-align: center">
				<p:commandButton icon="ui-icon-extlink" title="Alunos"
					action="#{turmaBean.buscarAlunosParaTurma}" process="@this"
					oncomplete="PF('mostraAlunos').show()" update="@form">
					<f:setPropertyActionListener target="#{turmaBean.turma}"
						value="#{turma}" />
				</p:commandButton>
			</p:column>


			<p:column headerText="Fórum" sortBy="#{turma.forum.nome}">
				<h:outputText value="#{turma.forum.nome}"  />
			</p:column>
			<p:column headerText="Curso" sortBy="#{turma.curso.nome}">
				<h:outputText value="#{turma.curso.nome}" />
			</p:column>

			<p:column>
				<p:button title="Alterar" icon="ui-icon-pencil"
					outcome="/turma/TurmaCadastro.xhtml">
					<f:param name="turma" value="#{turma.id}" />
				</p:button>

				<p:commandButton title="Excluir" id="btnRemover" icon="ui-icon-trash"
					oncomplete="PF('confirmacaoRemover').show()" process="@this"
					update=":frm2">
					<f:setPropertyActionListener value="#{turma}"
						target="#{turmaBean.turma}" />
				</p:commandButton>
			</p:column>
		</p:dataTable>


		<p:dialog widgetVar="confirmacaoRemover"
			header="Excluir turma" resizable="false"
			style="min-width: 300px" responsive="true">
			<h:panelGroup id="removerPanel" layout="block" styleClass="ui-fluid">
				<p:messages autoUpdate="true" />

				<h:outputText
					value="Tem certeza que deseja excluir a turma #{turmaBean.turma.numero }?" />
			</h:panelGroup>

			<p:button value="Não" onclick="PF('confirmacaoRemover').hide(); return false;" />

			<p:commandButton value="Sim" action="#{turmaBean.remover}"
				update=":frm2" process="@this"
				oncomplete="PF('confirmacaoRemover').hide()" />

		</p:dialog>
		
		<p:dialog id="mostraAlunosDialog" header="Turmas"
			widgetVar="mostraAlunos" resizable="false"
			style="min-width: 480px" responsive="true">
			<p:dataList value="#{turmaBean.turma.listaAlunos}"
				var="aluno" itemType="disc" emptyMessage="Nenhuma turma encontrada."
				>
				
				<h:outputText
					value="aluno id #{aluno.id } e nome #{aluno.nome}"  />
				
			</p:dataList>
			
		</p:dialog>



	</h:form>
</ui:define>

</ui:composition>

package com.universidadez.tcc.universidade.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;

import org.apache.log4j.Logger;
import org.primefaces.model.DualListModel;
import com.universidadez.tcc.login.model.Usuario;
import com.universidadez.tcc.login.repository.UsuarioRepository;
import com.universidadez.tcc.universidade.model.Turma;
import com.universidadez.tcc.universidade.repository.TurmaRepository;
import com.universidadez.tcc.util.JpaUtil;

@ManagedBean
@SessionScoped
public class TurmaBean implements Serializable {

private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(TurmaBean.class);

private Turma turma;
private List<Turma> turmas;
private List<Usuario> alunos;
private List<Usuario> alunosSelect;
private DualListModel<Usuario> model;



public TurmaBean() {
	this.turma = new Turma();
}



/**
 */
public void cadastrar() {
	logger.info("iniciou o método cadastrar.");
	EntityManager em = JpaUtil.getEntityManager();
	TurmaRepository tr = new TurmaRepository(em);
	FacesContext context = FacesContext.getCurrentInstance();

	try {
		tr.insere(turma);
		FacesMessage mensagem = new FacesMessage("Turma " + turma.getNumero() + " cadastrada com sucesso.");
		mensagem.setSeverity(FacesMessage.SEVERITY_INFO);
		context.addMessage(null, mensagem);
		this.turma = new Turma();
	} catch (Exception e) {
		FacesMessage mensagem = new FacesMessage("Problemas para cadastrar a Turma.");
		mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
		context.addMessage(null, mensagem);
	}
}


public void buscarAlunosParaTurma() {
	logger.info("iniciou o método busca alunos para turma.");
	EntityManager em = JpaUtil.getEntityManager();
	TurmaRepository tr = new TurmaRepository(em);
	turma = tr.buscarTurmaComAluno(turma.getId());
}

public void lista() {
	logger.info("iniciou o método lista.");
	EntityManager em = JpaUtil.getEntityManager();
	TurmaRepository tr = new TurmaRepository(em);
	this.turmas = tr.lista();
}



public void buscarTurmaComAlunos() {
	logger.info("iniciou o método listaAlunos");
	EntityManager em = JpaUtil.getEntityManager();
	UsuarioRepository ur = new UsuarioRepository(em);
	
	
	this.alunosSelect = turma.getListaAlunos();
	this.alunos = ur.listaAlunos();
	for (Usuario nome : alunos)
	{
		if(nome.equals(alunosSelect)){
			alunos.remove(nome);
		}
	}
	this.model = new DualListModel<>(
            new ArrayList<>(alunos),
            new ArrayList<>(alunosSelect)
        );
}

public void alterar() {
	logger.info("iniciou o método alterar.");
	EntityManager em = JpaUtil.getEntityManager();
	TurmaRepository tr = new TurmaRepository(em);
	FacesContext context = FacesContext.getCurrentInstance();

	try {
		tr.alterar(turma);
		FacesMessage mensagem = new FacesMessage("Turma " + turma.getNumero() + " Alterada com sucesso.");
		mensagem.setSeverity(FacesMessage.SEVERITY_INFO);
		context.addMessage(null, mensagem);
		this.turma = new Turma();
	} catch (Exception e) {
		FacesMessage mensagem = new FacesMessage("Problemas para alterar a Turma.");
		mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
		context.addMessage(null, mensagem);
	}
}
public void remover() {
	logger.info("iniciou o método remover.");
	EntityManager em = JpaUtil.getEntityManager();
	TurmaRepository tr = new TurmaRepository(em);
	FacesContext context = FacesContext.getCurrentInstance();

	try {
		tr.excluir(turma);
		FacesMessage mensagem = new FacesMessage("Turma " + turma.getNumero() + " excluida com sucesso.");
		mensagem.setSeverity(FacesMessage.SEVERITY_INFO);
		context.addMessage(null, mensagem);
		this.turma = new Turma();
		lista();
	} catch (Exception e) {
		FacesMessage mensagem = new FacesMessage("Problemas para remover a turma.");
		mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
		context.addMessage(null, mensagem);
	}
}



public Turma getTurma() {
	return turma;
}



public void setTurma(Turma turma) {
	this.turma = turma;
}







public List<Usuario> getAlunos() {
	return alunos;
}



public void setAlunos(List<Usuario> alunos) {
	this.alunos = alunos;
}



public List<Usuario> getAlunosSelect() {
	return alunosSelect;
}



public void setAlunosSelect(List<Usuario> alunosSelect) {
	this.alunosSelect = alunosSelect;
}



public DualListModel<Usuario> getModel() {
	return model;
}



public void setModel(DualListModel<Usuario> model) {
	this.model = model;
}



public List<Turma> getTurmas() {
	return turmas;
}



public void setTurmas(List<Turma> turmas) {
	this.turmas = turmas;
}

}

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p=“http://primefaces.org/ui"
xmlns:o=“http://omnifaces.org/ui"
template=”/WEB-INF/templates/LayoutAluno.xhtml”>

<ui:define name="titulo"> #{turmaBean.turma.id != null ? 'Edição de turma' : 'Nova turma' }</ui:define>
<f:metadata>
	<o:viewParam name="turma" value="#{turmaBean.turma}"/>
	<f:viewAction action="#{cursoBean.lista}" />
	<f:viewAction action="#{usuarioBean.listaProfessores}" />
	<f:viewAction action="#{turmaBean.buscarTurmaComAlunos}"/>
</f:metadata>


<ui:define name="content">


	<h1 class="aw-page-title">#{turmaBean.turma.id != null ? 'Edição de turma' : 'Nova turma' }</h1>
	<h:form id="cadastrarTurma">
		<p:messages></p:messages>
		
		<div class="ui-fluid" >
			<p:tabView style="margin-top: 20px">
			
			<p:tab title="Turma">
			<h:panelGrid columns="4" id="painel" layout="grid"
				style="margin-top: 20px" styleClass="panelgrid-noborder"
				columnClasses="ui-grid-col-2,ui-grid-col-4,ui-grid-col-2,ui-grid-col-4">


				<p:outputLabel value="Numero:" for="numero" />
				<p:inputText id="numero" value="#{turmaBean.turma.numero}"
					size="60" />

				<p:outputLabel id="cur" value="Curso" for="curso" />
					<h:selectOneMenu id="curso"
						value="#{turmaBean.turma.curso}" required="true"
						requiredMessage="Por favor selecione um curso">
						<f:selectItem itemLabel="Selecione" />
						<f:selectItems value="#{cursoBean.cursos}" var="curs"
							itemLabel="#{curs.nome}" itemValue="#{curs}" />
					</h:selectOneMenu>
				
			</h:panelGrid>
			</p:tab>
				<p:tab title="Professor" rendered="#{turmaBean.turma.id != null}">

					<p:panelGrid>

						<p:outputLabel id="prof" value="Professor" for="professor" />
						<h:selectOneMenu id="professor"
							value="#{turmaBean.turma.professor}" required="true"
							requiredMessage="Por favor selecione um professor">
							<f:selectItem itemLabel="Selecione" />
							<f:selectItems value="#{usuarioBean.professores}" var="prof"
								itemLabel="#{prof.nome}" itemValue="#{prof}" />
						</h:selectOneMenu>
					</p:panelGrid>
				</p:tab>
				
				
				<p:tab title="Alunos">
					<p:pickList responsive="true" value="#{turmaBean.model}"
						var="aluno" itemValue="#{aluno}" itemLabel="#{aluno.nome}">
						<o:converter converterId="omnifaces.ListConverter"
							list="#{turmaBean.alunos}" />
							<o:converter converterId="omnifaces.ListConverter"
							list="#{turmaBean.alunosSelect}" />
					</p:pickList>
					<p>
						<h:commandButton value="Selecionar para salvar">
							<f:ajax execute="@form" render="@form" />
							<f:setPropertyActionListener value="#{turmaBean.model.target}"
							target="#{turmaBean.turma.listaAlunos}" />
						</h:commandButton>
						
						 </p>
					

						
					
				</p:tab>
				</p:tabView>


			<p:toolbar style="margin-top: 20px">
				<p:toolbarGroup>
					<p:button value="Voltar" outcome="/turma/Turma.xhtml" />						
				</p:toolbarGroup>
				<p:toolbarGroup>
				<p:commandButton value="Salvar" action="#{turmaBean.cadastrar}"
						update="@form" rendered="#{turmaBean.turma.id == null}">
						<f:param name="turma" value="#{turma.id}" />
				</p:commandButton>

					<p:commandButton value="Salvar" action="#{turmaBean.alterar}"
				update="@form" rendered="#{turmaBean.turma.id != null}" />
				
				
				</p:toolbarGroup>
			</p:toolbar>			
			
			


			</div>	
		
	</h:form>

</ui:define>

</ui:composition>

package com.universidadez.tcc.universidade.model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

import com.universidadez.tcc.forum.model.Forum;
import com.universidadez.tcc.login.model.Usuario;

@NamedQueries({ @NamedQuery(name = “Turma.lista”, query = “SELECT t FROM Turma t”)})
@Entity
@Table(name = “tb_turma”)
public class Turma implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

private Long id;

private Usuario professor;
private String numero;
private List<Usuario> listaAlunos;
private Forum forum;       
private Curso curso;


public Turma(){}

public Turma(Long id, Usuario professor, String numero, List<Usuario> listaAlunos, Curso curso, Forum forum) {
	
	this.id = id;
	this.professor = professor;
	this.numero = numero;
	this.listaAlunos = (List<Usuario>)listaAlunos;
	this.curso = curso;
	this.forum = forum;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
	return id;
}
public void setId(Long id) {
	this.id = id;
}

@ManyToOne(optional = true,fetch = FetchType.EAGER)
public Usuario getProfessor() {
	return professor;
}
public void setProfessor(Usuario professor) {
	this.professor = professor;
}
@PrimaryKeyJoinColumn
@OneToOne(cascade = CascadeType.ALL , optional = true, orphanRemoval = true,fetch = FetchType.EAGER)
@JoinColumn(name = "id_forum")
public Forum getForum() {
	return forum;
}

public void setForum(Forum forum) {
	this.forum = forum;
}



@Size(min= 1,max= 5)
@NotEmpty
@Column(length = 5,name = "numero_turma", unique = true )
public String getNumero() {
	return numero;
}
public void setNumero(String numero) {
	this.numero = numero;
}


@ManyToMany(fetch = FetchType.LAZY )
@JoinTable(name = "turma_aluno_lista", joinColumns = @JoinColumn(name = "codigo_Turma"), inverseJoinColumns = @JoinColumn(name = "codigo_aluno"))
public List<Usuario> getListaAlunos() {
	return listaAlunos;
}
public void setListaAlunos(List<Usuario> listaAlunos) {
	this.listaAlunos = listaAlunos;
}


@ManyToOne
@JoinColumn(name="curso_id")      
public Curso getCurso() {
	return curso;
}

public void setCurso(Curso curso) {
	this.curso = curso;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((curso == null) ? 0 : curso.hashCode());
	result = prime * result + ((id == null) ? 0 : id.hashCode());
	result = prime * result + ((numero == null) ? 0 : numero.hashCode());
	result = prime * result + ((professor == null) ? 0 : professor.hashCode());
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Turma other = (Turma) obj;
	if (curso == null) {
		if (other.curso != null)
			return false;
	} else if (!curso.equals(other.curso))
		return false;
	if (id == null) {
		if (other.id != null)
			return false;
	} else if (!id.equals(other.id))
		return false;
	if (numero == null) {
		if (other.numero != null)
			return false;
	} else if (!numero.equals(other.numero))
		return false;
	if (professor == null) {
		if (other.professor != null)
			return false;
	} else if (!professor.equals(other.professor))
		return false;
	return true;
}

}