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;
}
}