Atualização de registro disparando varios selects

boa tarde, estou desenvolvendo um projeto e após fazer uma importação de alguns dados, estou testando o desempenho e notei uma coisa que não consegui compreender, ao atualizar minha entidade matricula a mesma que contém um aluno executa um select para cada aluno do meu banco deixando o processo muito lento, ou seja, em 3000 alunos, ele faz 3000 selects a cada atualização, já na inserção esta bem rápido vou postar minhas entidades.
Estou utilizando ejb 3.1 as transações são gerenciadas pelo container e o meu método disparado é o merge
alguem já passou por este problema?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.usinaweb.secom.entity;

import java.io.Serializable;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author Rogério Martins
 */
@Entity
@Table(name = "esc_matricula", catalog = "secom", schema = "", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"sertrm_codigo", "aln_codigo"})})
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "EscMatricula.findAll", query = "SELECT e FROM EscMatricula e")})
public class EscMatricula implements Serializable {
    @Size(max = 2)
    @Column(name = "matcl_status", length = 2)
    private String matclStatus;
    @Size(max = 2)
    @Column(name = "matcl_recuperacao", length = 2)
    private String matclRecuperacao;
    @Column(name = "matcl_codigo_importacao")
    private Integer matclCodigoImportacao;
    @Size(max = 15)
    @Column(name = "matcl_codigo_estado", length = 15)
    private String matclCodigoEstado;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
//    @NotNull
    @Column(name = "matcl_codigo", nullable = false)
    private Integer matclCodigo;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2)
    @Column(name = "matcl_bolsista", nullable = false, length = 2)
    private String matclBolsista;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "escMatricula")
    private List<EscContrinuicoes> escContrinuicoesList;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "escMatricula")
    private List<EscFrequencia> escFrequenciaList;
    @JoinColumn(name = "sertrm_codigo", referencedColumnName = "sertrm_codigo", nullable = false)
    @ManyToOne(optional = false)
    private EscSerieTurma escSerieTurma;
    @JoinColumn(name = "aln_codigo", referencedColumnName = "aln_codigo", nullable = false)
    @ManyToOne(optional = false)
    private CadAluno cadAluno;

    public EscMatricula() {
    }

    public EscMatricula(Integer matclCodigo) {
        this.matclCodigo = matclCodigo;
    }

    public EscMatricula(Integer matclCodigo, String matclBolsista) {
        this.matclCodigo = matclCodigo;
        this.matclBolsista = matclBolsista;
    }

    public Integer getMatclCodigo() {
        return matclCodigo;
    }

    public void setMatclCodigo(Integer matclCodigo) {
        this.matclCodigo = matclCodigo;
    }

    public String getMatclBolsista() {
        return matclBolsista;
    }

    public void setMatclBolsista(String matclBolsista) {
        this.matclBolsista = matclBolsista;
    }

    @XmlTransient
    public List<EscContrinuicoes> getEscContrinuicoesList() {
        return escContrinuicoesList;
    }

    public void setEscContrinuicoesList(List<EscContrinuicoes> escContrinuicoesList) {
        this.escContrinuicoesList = escContrinuicoesList;
    }

    @XmlTransient
    public List<EscFrequencia> getEscFrequenciaList() {
        return escFrequenciaList;
    }

    public void setEscFrequenciaList(List<EscFrequencia> escFrequenciaList) {
        this.escFrequenciaList = escFrequenciaList;
    }

    public EscSerieTurma getEscSerieTurma() {
        return escSerieTurma;
    }

    public void setEscSerieTurma(EscSerieTurma escSerieTurma) {
        this.escSerieTurma = escSerieTurma;
    }

    public CadAluno getCadAluno() {
        return cadAluno;
    }

    public void setCadAluno(CadAluno cadAluno) {
        this.cadAluno = cadAluno;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (matclCodigo != null ? matclCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof EscMatricula)) {
            return false;
        }
        EscMatricula other = (EscMatricula) object;
        if ((this.matclCodigo == null && other.matclCodigo != null) || (this.matclCodigo != null && !this.matclCodigo.equals(other.matclCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.usinaweb.secom.entity.EscMatricula[ matclCodigo=" + matclCodigo + " ]";
    }

    public String getMatclCodigoEstado() {
        return matclCodigoEstado;
    }

    public void setMatclCodigoEstado(String matclCodigoEstado) {
        this.matclCodigoEstado = matclCodigoEstado;
    }

    public Integer getMatclCodigoImportacao() {
        return matclCodigoImportacao;
    }

    public void setMatclCodigoImportacao(Integer matclCodigoImportacao) {
        this.matclCodigoImportacao = matclCodigoImportacao;
    }

    public String getMatclStatus() {
        return matclStatus;
    }

    public void setMatclStatus(String matclStatus) {
        this.matclStatus = matclStatus;
    }

    public String getMatclRecuperacao() {
        return matclRecuperacao;
    }

    public void setMatclRecuperacao(String matclRecuperacao) {
        this.matclRecuperacao = matclRecuperacao;
    }
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.usinaweb.secom.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author rms
 */
    @Entity
@Table(name = "cad_aluno", catalog = "secom", schema = "")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "CadAluno.findAll", query = "SELECT c FROM CadAluno c")})
public class CadAluno implements Serializable {
    @Column(name = "aln_data_transferencia")
    @Temporal(TemporalType.DATE)
    private Date alnDataTransferencia;
    @Column(name = "aln_codigo_importacao")
    private Integer alnCodigoImportacao;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2)
    @Column(name = "aln_importado", nullable = false, length = 2)
    private String alnImportado;
    @OneToMany(mappedBy = "cadAluno")
    private List<MovProdutosServicos> movProdutosServicosList;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2)
    @Column(name = "aln_status", nullable = false, length = 2)
    private String alnStatus;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
//    @NotNull
    @Column(name = "aln_codigo", nullable = false)
    private Integer alnCodigo;
    @Size(max = 250)
    @Column(name = "aln_pai", length = 250)
    private String alnPai;
    @Size(max = 250)
    @Column(name = "aln_mae", length = 250)
    private String alnMae;
    @Size(max = 2)
    @Column(name = "aln_cor", length = 2)
    private String alnCor;
    @JoinColumn(name = "undd_codigo", referencedColumnName = "undd_codigo", nullable = false)
    @ManyToOne(optional = false)
    private CadUnidade cadUnidade;
    @JoinColumn(name = "pss_codigo", referencedColumnName = "pss_codigo", nullable = false)
    @ManyToOne(optional = false)
    private CadPessoa cadPessoa;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "cadAluno")
    private List<EscHistorico> escHistoricoList;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "cadAluno")
    private List<EscMatricula> escMatriculaList;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "cadAluno")
    private List<EscPreMatricula> escPreMatriculaList;

    public CadAluno() {
    }

    public CadAluno(Integer alnCodigo) {
        this.alnCodigo = alnCodigo;
    }

    public Integer getAlnCodigo() {
        return alnCodigo;
    }

    public void setAlnCodigo(Integer alnCodigo) {
        this.alnCodigo = alnCodigo;
    }

    public String getAlnPai() {
        return alnPai;
    }

    public void setAlnPai(String alnPai) {
        this.alnPai = alnPai;
    }

    public String getAlnMae() {
        return alnMae;
    }

    public void setAlnMae(String alnMae) {
        this.alnMae = alnMae;
    }

    public String getAlnCor() {
        return alnCor;
    }

    public void setAlnCor(String alnCor) {
        this.alnCor = alnCor;
    }

    public CadUnidade getCadUnidade() {
        return cadUnidade;
    }

    public void setCadUnidade(CadUnidade cadUnidade) {
        this.cadUnidade = cadUnidade;
    }

    public CadPessoa getCadPessoa() {
        return cadPessoa;
    }

    public void setCadPessoa(CadPessoa cadPessoa) {
        this.cadPessoa = cadPessoa;
    }

    @XmlTransient
    public List<EscHistorico> getEscHistoricoList() {
        return escHistoricoList;
    }

    public void setEscHistoricoList(List<EscHistorico> escHistoricoList) {
        this.escHistoricoList = escHistoricoList;
    }

    @XmlTransient
    public List<EscMatricula> getEscMatriculaList() {
        return escMatriculaList;
    }

    public void setEscMatriculaList(List<EscMatricula> escMatriculaList) {
        this.escMatriculaList = escMatriculaList;
    }

    @XmlTransient
    public List<EscPreMatricula> getEscPreMatriculaList() {
        return escPreMatriculaList;
    }

    public void setEscPreMatriculaList(List<EscPreMatricula> escPreMatriculaList) {
        this.escPreMatriculaList = escPreMatriculaList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (alnCodigo != null ? alnCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof CadAluno)) {
            return false;
        }
        CadAluno other = (CadAluno) object;
        if ((this.alnCodigo == null && other.alnCodigo != null) || (this.alnCodigo != null && !this.alnCodigo.equals(other.alnCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.usinaweb.secom.entity.CadAluno[ alnCodigo=" + alnCodigo + " ]";
    }

    public String getAlnStatus() {
        return alnStatus;
    }

    public void setAlnStatus(String alnStatus) {
        this.alnStatus = alnStatus;
    }

    @XmlTransient
    public List<MovProdutosServicos> getMovProdutosServicosList() {
        return movProdutosServicosList;
    }

    public void setMovProdutosServicosList(List<MovProdutosServicos> movProdutosServicosList) {
        this.movProdutosServicosList = movProdutosServicosList;
    }

    public String getAlnImportado() {
        return alnImportado;
    }

    public void setAlnImportado(String alnImportado) {
        this.alnImportado = alnImportado;
    }

    public Integer getAlnCodigoImportacao() {
        return alnCodigoImportacao;
    }

    public void setAlnCodigoImportacao(Integer alnCodigoImportacao) {
        this.alnCodigoImportacao = alnCodigoImportacao;
    }

    public Date getAlnDataTransferencia() {
        return alnDataTransferencia;
    }

    public void setAlnDataTransferencia(Date alnDataTransferencia) {
        this.alnDataTransferencia = alnDataTransferencia;
    }
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.usinaweb.secom.entity;

import br.com.usinaweb.secom.anotacoes.CPF;
import br.com.usinaweb.secom.anotacoes.Telefone;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.hibernate.validator.constraints.Email;

/**
 *
 * @author rms
 */
@Entity
@Table(name = "cad_pessoa", catalog = "secom", schema = "")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "CadPessoa.findAll", query = "SELECT c FROM CadPessoa c")})
public class CadPessoa implements Serializable {
    @Column(name =     "pss_nasc")
    @Temporal(TemporalType.DATE)
    private Date pssNasc;
    @Basic(optional =     false)
    @NotNull
    @Column(name = "pss_cadastro", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date pssCadastro;
    @Lob
    @Size(max = 65535)
    @Column(name = "pss_observacao", length = 65535)
    private String pssObservacao;
    @Column(name = "pss_codigo_importacao")
    private Integer pssCodigoImportacao;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
//    @NotNull
    @Column(name = "pss_codigo", nullable = false)
    private Integer pssCodigo;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "pss_nome", nullable = false, length = 255)
    private String pssNome;
    @Size(max = 2)
    @Column(name = "pss_sexo", length = 2)
    private String pssSexo;
    @Size(max = 2)
    @Column(name = "pss_estado_civil", length = 2)
    private String pssEstadoCivil;
    @Size(max = 100)
    @Column(name = "pss_natural", length = 100)
    private String pssNatural;
    @Size(max = 13)
    @Column(name = "pss_tel_res", length = 13)
    @Telefone
    private String pssTelRes;
    @Size(max = 13)
    @Column(name = "pss_tel_cel", length = 13)
    @Telefone
    private String pssTelCel;
    @Size(max = 13)
    @Column(name = "pss_tel_com", length = 13)
    @Telefone
    private String pssTelCom;
    @Size(max = 28)
    @Column(name = "pss_rg", length = 28)
    private String pssRg;
    @Size(max = 14)
    @Column(name = "pss_cpf", length = 14)
    @CPF
    private String pssCpf;
    @Size(max = 150)
    @Column(name = "pss_email", length = 150)
    @Email
    private String pssEmail;
    @Size(max = 2)
    @Column(name = "pss_origem", length = 2)
    private String pssOrigem;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "cadPessoa")
    private List<CadAluno> cadAlunoList;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "cadPessoa")
    private List<CadFornecedor> cadFornecedorList;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "cadPessoa")
    private List<CadFichaMedica> cadFichaMedicaList;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "cadPessoa")
    private List<CadFuncionario> cadFuncionarioList;
    @JoinColumn(name = "endrc_codigo", referencedColumnName = "endrc_codigo")
    @ManyToOne
    private CadEndereco cadEndereco;

    public CadPessoa() {
    }

    public CadPessoa(Integer pssCodigo) {
        this.pssCodigo = pssCodigo;
    }

    public CadPessoa(Integer pssCodigo, String pssNome, Date pssCadastro) {
        this.pssCodigo = pssCodigo;
        this.pssNome = pssNome;
        this.pssCadastro = pssCadastro;
    }

    public Integer getPssCodigo() {
        return pssCodigo;
    }

    public void setPssCodigo(Integer pssCodigo) {
        this.pssCodigo = pssCodigo;
    }

    public String getPssNome() {
        return pssNome;
    }

    public void setPssNome(String pssNome) {
        this.pssNome = pssNome;
    }

    public Date getPssNasc() {
        return pssNasc;
    }

    public void setPssNasc(Date pssNasc) {
        this.pssNasc = pssNasc;
    }

    public String getPssSexo() {
        return pssSexo;
    }

    public void setPssSexo(String pssSexo) {
        this.pssSexo = pssSexo;
    }

    public String getPssEstadoCivil() {
        return pssEstadoCivil;
    }

    public void setPssEstadoCivil(String pssEstadoCivil) {
        this.pssEstadoCivil = pssEstadoCivil;
    }

    public String getPssNatural() {
        return pssNatural;
    }

    public void setPssNatural(String pssNatural) {
        this.pssNatural = pssNatural;
    }

    public String getPssTelRes() {
        return pssTelRes;
    }

    public void setPssTelRes(String pssTelRes) {
        this.pssTelRes = pssTelRes;
    }

    public String getPssTelCel() {
        return pssTelCel;
    }

    public void setPssTelCel(String pssTelCel) {
        this.pssTelCel = pssTelCel;
    }

    public String getPssTelCom() {
        return pssTelCom;
    }

    public void setPssTelCom(String pssTelCom) {
        this.pssTelCom = pssTelCom;
    }

    public String getPssRg() {
        return pssRg;
    }

    public void setPssRg(String pssRg) {
        this.pssRg = pssRg;
    }

    public String getPssCpf() {
        return pssCpf;
    }

    public void setPssCpf(String pssCpf) {
        this.pssCpf = pssCpf;
    }

    public String getPssEmail() {
        return pssEmail;
    }

    public void setPssEmail(String pssEmail) {
        this.pssEmail = pssEmail;
    }

    public String getPssOrigem() {
        return pssOrigem;
    }

    public void setPssOrigem(String pssOrigem) {
        this.pssOrigem = pssOrigem;
    }

    public Date getPssCadastro() {
        return pssCadastro;
    }

    public void setPssCadastro(Date pssCadastro) {
        this.pssCadastro = pssCadastro;
    }

    @XmlTransient
    public List<CadAluno> getCadAlunoList() {
        return cadAlunoList;
    }

    public void setCadAlunoList(List<CadAluno> cadAlunoList) {
        this.cadAlunoList = cadAlunoList;
    }

    @XmlTransient
    public List<CadFornecedor> getCadFornecedorList() {
        return cadFornecedorList;
    }

    public void setCadFornecedorList(List<CadFornecedor> cadFornecedorList) {
        this.cadFornecedorList = cadFornecedorList;
    }

    @XmlTransient
    public List<CadFichaMedica> getCadFichaMedicaList() {
        return cadFichaMedicaList;
    }

    public void setCadFichaMedicaList(List<CadFichaMedica> cadFichaMedicaList) {
        this.cadFichaMedicaList = cadFichaMedicaList;
    }

    @XmlTransient
    public List<CadFuncionario> getCadFuncionarioList() {
        return cadFuncionarioList;
    }

    public void setCadFuncionarioList(List<CadFuncionario> cadFuncionarioList) {
        this.cadFuncionarioList = cadFuncionarioList;
    }

    public CadEndereco getCadEndereco() {
        return cadEndereco;
    }

    public void setCadEndereco(CadEndereco cadEndereco) {
        this.cadEndereco = cadEndereco;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (pssCodigo != null ? pssCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof CadPessoa)) {
            return false;
        }
        CadPessoa other = (CadPessoa) object;
        if ((this.pssCodigo == null && other.pssCodigo != null) || (this.pssCodigo != null && !this.pssCodigo.equals(other.pssCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.usinaweb.secom.entity.CadPessoa[ pssCodigo=" + pssCodigo + " ]";
    }

    public Integer getPssCodigoImportacao() {
        return pssCodigoImportacao;
    }

    public void setPssCodigoImportacao(Integer pssCodigoImportacao) {
        this.pssCodigoImportacao = pssCodigoImportacao;
    }

    public String getPssObservacao() {
        return pssObservacao;
    }

    public void setPssObservacao(String pssObservacao) {
        this.pssObservacao = pssObservacao;
    }
}