Erro no Hibernate (PropertyAccessException)

Está dando um erro ao fazer uma consulta no Hibernate.
Logo abaixo tem minhas classes POJOS, e a classe com o Criteria.
Note que minhas classes POJOS tem chave composta. Será que meu erro tem alguma coisa a ver com isto?

500 Internal Server Error

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.unesp.sisor.model.Tsisorcategoria_economica.numcategoria
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:35)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183)
	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3589)
	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3305)
	at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:87)
	at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1707)
	at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1678)
	at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563)
	at org.hibernate.loader.Loader.doQuery(Loader.java:673)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2220)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at br.unesp.sisor.dao.DespesaOrcDao.recuperarListaPorCategoria(DespesaOrcDao.java:30)
	at br.unesp.sisor.action.portaria.SisorPortariaSuplementacaoAction.execute(SisorPortariaSuplementacaoAction.java:66)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:719)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:376)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:870)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:451)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:218)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:119)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
	at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
	at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:230)
	at oracle.oc4j.network.ServerSocketAcceptHandler.access$800(ServerSocketAcceptHandler.java:33)
	at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:831)
	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
	at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.IllegalArgumentException
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)
	at java.lang.reflect.Field.get(Field.java:357)
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:32)
	... 39 more

Classe DAO:

public class DespesaOrcDao extends BaseDao<Tsisoritem_despesa, Long>{
   
    public DespesaOrcDao() {
        super(Tsisoritem_despesa.class);
    }
    
    public List recuperarListaPorCategoria(SisorPortariaSuplRedForm formulario)throws Exception{        
        
        Collection<String> chaves = new ArrayList();//cria uma coleção com a chave para a busca
        Collection valores = new ArrayList();  //cria uma coleção para os valores da chave para a busca        
        
        chaves.add("categ_numcategoria");        
        valores.add(formulario.getCategEcon());  
        
       
        Criteria consulta = construirCriterio(chaves, valores);
        
        List<Tsisoritem_despesa> listagem = consulta.list();
        return listagem;
       
    }
}

Método com o critério da consulta:


    protected Criteria construirCriterio(Collection<String> chaves, Collection valores) {
        Criteria consulta = session.createCriteria(objectClass);
        if (chaves.size()!=valores.size())
            throw new RuntimeException("O número de chaves deve ser igual ao de valores.");
        Iterator<String> iChaves = chaves.iterator();
        Iterator iValores = valores.iterator();
        while (iChaves.hasNext())
        {
            String chave = iChaves.next();
            Object valor = iValores.next();
            if (valor != null){ 
             consulta.add( Expression.eq(chave, valor));
            }
        }
        return consulta;
    }  

As classes POJO que eu utilizo:

@Entity
@Table(name = "TSISORITEM_DESPESA")
public class Tsisoritem_despesa implements Serializable {

    @EmbeddedId
    private Tsisoritem_despesa.PK pk;
     
    @ManyToOne
    @JoinColumn(name="categ_numcategoria", insertable=false, updatable=false )
    private Tsisorcategoria_economica categ_numcategoria;

    private String chrfinalidade;

    private String strnomeitemdesp;

    private String strcoditemdesp;

    private String chrdesdobramento;

    private String chrnotafiscal;

    private String chrpessoa;

    private String chrencvcontrat;

    private String chrtipodespesa;



    private static final long serialVersionUID = 1L;

    public Tsisoritem_despesa() {
        super();
    }
    
    public Tsisoritem_despesa.PK getPk() {
            return this.pk;
    }

    public void setPk(Tsisoritem_despesa.PK pk) {
            this.pk = pk;
    }

    public String getChrfinalidade() {
        return this.chrfinalidade;
    }

    public void setChrfinalidade(String chrfinalidade) {
        this.chrfinalidade = chrfinalidade;
    }

    public String getStrnomeitemdesp() {
        return this.strnomeitemdesp;
    }

    public void setStrnomeitemdesp(String strnomeitemdesp) {
        this.strnomeitemdesp = strnomeitemdesp;
    }

    public String getStrcoditemdesp() {
        return this.strcoditemdesp;
    }

    public void setStrcoditemdesp(String strcoditemdesp) {
        this.strcoditemdesp = strcoditemdesp;
    }

    public String getChrdesdobramento() {
        return this.chrdesdobramento;
    }

    public void setChrdesdobramento(String chrdesdobramento) {
        this.chrdesdobramento = chrdesdobramento;
    }

    public String getChrnotafiscal() {
        return this.chrnotafiscal;
    }

    public void setChrnotafiscal(String chrnotafiscal) {
        this.chrnotafiscal = chrnotafiscal;
    }

    public String getChrpessoa() {
        return this.chrpessoa;
    }

    public void setChrpessoa(String chrpessoa) {
        this.chrpessoa = chrpessoa;
    }

    public String getChrencvcontrat() {
        return this.chrencvcontrat;
    }

    public void setChrencvcontrat(String chrencvcontrat) {
        this.chrencvcontrat = chrencvcontrat;
    }

    public String getChrtipodespesa() {
        return this.chrtipodespesa;
    }

    public void setChrtipodespesa(String chrtipodespesa) {
        this.chrtipodespesa = chrtipodespesa;
    }



    public void setCateg_numcategoria(Tsisorcategoria_economica categ_numcategoria) {
        this.categ_numcategoria = categ_numcategoria;
    }

    public Tsisorcategoria_economica getCateg_numcategoria() {
        return categ_numcategoria;
    }

 
     public String getNomeCompleto(){
         return this.strcoditemdesp + " - " + this.strnomeitemdesp;
     }
    
    @Embeddable
    public static class PK implements Serializable {
            @ManyToOne
            @JoinColumn(name="categ_numcategoria")
            private Tsisorcategoria_economica categNumcategoria;
            private Integer numitemdesp;
            private static final long serialVersionUID = 1L;

            public PK() {
                    super();
            }

            public Tsisorcategoria_economica getCategNumcategoria() {
                    return this.categNumcategoria;
            }

            public void setCategNumcategoria(Tsisorcategoria_economica categNumcategoria) {
                    this.categNumcategoria = categNumcategoria;
            }

            public Integer getNumitemdesp() {
                    return this.numitemdesp;
            }

            public void setNumitemdesp(Integer numitemdesp) {
                    this.numitemdesp = numitemdesp;
            }

            @Override
            public boolean equals(Object o) {
                    if (o == this) {
                            return true;
                    }
                    if ( ! (o instanceof PK)) {
                            return false;
                    }
                    PK other = (PK) o;
                    return this.categNumcategoria.equals(other.categNumcategoria)
                            && this.numitemdesp.equals(other.numitemdesp);
            }

            @Override
            public int hashCode() {
                    return this.categNumcategoria.hashCode()
                            ^ this.numitemdesp.hashCode();
            }

    }
    
   
}

e a outra classe pojo

@Entity
@Table(name="TSISORCATEGORIA_ECONOMICA")
public class Tsisorcategoria_economica implements Serializable {
       
        @Id
        @GenericGenerator(name="pk_categ", strategy="increment")
        @GeneratedValue(generator="pk_categ")
	private Integer numcategoria;

	private String strcategoria;

	private String chrativacao;

	private String strcodcategoria;

	@OneToMany(mappedBy="categ_numcategoria")
	private Set<Tsisoritem_despesa> tsisoritemDespesaCollection;

	@OneToMany(mappedBy="categ_numcategoria")
	private Set<TsisorfprogportariaCateg> tsisorfprogportariaCategCollection;

	private static final long serialVersionUID = 1L;

	public Tsisorcategoria_economica() {
		super();
	}

	public Integer getNumcategoria() {
		return this.numcategoria;
	}

	public void setNumcategoria(Integer numcategoria) {
		this.numcategoria = numcategoria;
	}

	public String getStrcategoria() {
		return this.strcategoria;
	}

	public void setStrcategoria(String strcategoria) {
		this.strcategoria = strcategoria;
	}

	public String getChrativacao() {
		return this.chrativacao;
	}

	public void setChrativacao(String chrativacao) {
		this.chrativacao = chrativacao;
	}

	public String getStrcodcategoria() {
		return this.strcodcategoria;
	}

	public void setStrcodcategoria(String strcodcategoria) {
		this.strcodcategoria = strcodcategoria;
	}
        


        public void setTsisoritemDespesaCollection(Set<Tsisoritem_despesa> tsisoritemDespesaCollection) {
            this.tsisoritemDespesaCollection = tsisoritemDespesaCollection;
        }
    
        public Set<Tsisoritem_despesa> getTsisoritemDespesaCollection() {
            return tsisoritemDespesaCollection;
        }
        
        public void setTsisorfprogportariaCategCollection(Set<TsisorfprogportariaCateg> tsisorfprogportariaCategCollection) {
            this.tsisorfprogportariaCategCollection = tsisorfprogportariaCategCollection;
        }
    
        public Set<TsisorfprogportariaCateg> getTsisorfprogportariaCategCollection() {
            return tsisorfprogportariaCategCollection;
        }
        
        public String getNomeCompleto(){
            return this.strcodcategoria + " - " + this.strcategoria;
        }

    
}