Olá;
Antes de postar eu pesquisei no fórum e no pai google e encontrei muitas soluções para esse erro porém com as causas mais distintas, não consegui relacionar nenhuma solução com o problema apresentado na minha codificação.
Eu estou desenvolvendo um sistema para o Laboratório de Pesquisas Paleontológicas da Universidade Federal do Acre para o gerenciamento do acervo fóssil deles.
Exatamente estou codificando as classificações taxonômicas, conforme a figura:
(Somente da Classe para baixo).
![]()
Então, uma Classe possui uma lista de Ordem que por sua vez possui uma unica Classe.
Uma Ordem possui uma lista de Família que por sua vez possui uma unica Ordem.
Uma Família possui uma lista de Gênero que por sua vez possui uma unica Família.
Um Gênero possui uma lista de Espécie que por sua vez possui um único Gênero.
A seguinte mensagem de erro é gerada quando eu tento listar todas as Famílias.
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not set a field value by reflection setter of br.com.barionix.entidades.Familia.ordem
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1356)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1284)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:261)
at br.com.barionix.controle.FamiliaJpaController.findFamiliaEntities(FamiliaJpaController.java:187)
at br.com.barionix.controle.FamiliaJpaController.findFamiliaEntities(FamiliaJpaController.java:172)
at br.com.barionix.main.Main.main(Main.java:46)
Caused by: org.hibernate.PropertyAccessException: could not set a field value by reflection setter of br.com.barionix.entidades.Familia.ordem
at org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:150)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:707)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:371)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4232)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:168)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1006)
at org.hibernate.loader.Loader.doQuery(Loader.java:883)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
at org.hibernate.loader.Loader.doList(Loader.java:2463)
at org.hibernate.loader.Loader.doList(Loader.java:2449)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279)
at org.hibernate.loader.Loader.list(Loader.java:2274)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1115)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252)
... 3 more
Caused by: java.lang.IllegalArgumentException: Can not set br.com.barionix.entidades.Ordem field br.com.barionix.entidades.Familia.ordem to br.com.barionix.entidades.Familia
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:680)
at org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:138)
... 20 more
O que me intriga é que somente na listagem das família que esse erro é lançado, para as outras classificações taxonômicas não.
Vou colocar embaixo a implementação das classe (entidades) família e ordem.
Família
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package br.com.barionix.entidades;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
/**
*
-
@author Albert
*/
@Entity
public class Familia extends ClassificacaoTaxonomica implements Serializable {@Column
private String nomeFamilia;@ManyToOne
private Ordem ordem;@OneToMany
private List generos;public String getNomeFamilia() {
return nomeFamilia;
}public void setNomeFamilia(String nomeFamilia) {
this.nomeFamilia = nomeFamilia;
}public Ordem getOrdem() {
return ordem;
}public void setOrdem(Ordem ordem) {
this.ordem = ordem;
}public List getGeneros() {
return generos;
}public void setGeneros(List generos) {
this.generos = generos;
}@Override
public String toString() {
return this.nomeFamilia;
}
}
[/code]
Ordem
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package br.com.barionix.entidades;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
/**
*
-
@author Albert
*/
@Entity
public class Ordem extends ClassificacaoTaxonomica implements Serializable {@Column
private String nomeOrdem;@ManyToOne
private Classe classe;@OneToMany
private List familias;public String getNomeOrdem() {
return nomeOrdem;
}public void setNomeOrdem(String nomeOrdem) {
this.nomeOrdem = nomeOrdem;
}public Classe getClasse() {
return classe;
}public void setClasse(Classe classe) {
this.classe = classe;
}public List getFamilias() {
return familias;
}public void setFamilias(List familias) {
this.familias = familias;
}@Override
public String toString() {
return this.nomeOrdem;
}
}
[/code]
E para critério de comparação embaixo segue o código da classe Classe.
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package br.com.barionix.entidades;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
/**
*
-
@author Albert
*/
@Entity
public class Classe extends ClassificacaoTaxonomica implements Serializable {@Column
private String nomeClasse;@OneToMany
private List ordems;public String getNomeClasse() {
return nomeClasse;
}public void setNomeClasse(String nomeClasse) {
this.nomeClasse = nomeClasse;
}public List getOrdems() {
return ordems;
}public void setOrdems(List ordems) {
this.ordems = ordems;
}@Override
public String toString() {
return this.nomeClasse;
}
}
[/code]
Todas outras classes funcionam perfeitamente, somente Família que apresenta esse erro.
Grato pela ajuda.