IllegalArgumentException ao pegar método da propriedade id.[Resolvido]

13 respostas
worldsoft

Boa noite a todos!

Tenho o seguinte MER:

Category
  id - Pk
  description 
  parent - fk de category id

Mais ou menos isso, dessa forma eu criei a seguinte classe:

@Entity
public class Category {
	private Long id;
	private String description;
	private Category parent;
	
	@Id
	@SequenceGenerator(name="sequence_category", sequenceName="sequence_category", initialValue=1)
	@GeneratedValue(strategy=GenerationType.AUTO, generator="sequence_category")
	public Long getId() {		
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}
	
	@Column(length=60, nullable=false)
	public String getDescription() {
		return description;
	}
	
	public void setDescription(String description) {
		this.description = description;
	}
	
	@JoinColumn(name="parent")
	@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)	
	public Category getParent() {
		return parent;
	}
	
	public void setParent(Category parent) {
		this.parent = parent;
	}	
}

Só que quando faço uma pesquisa no BD pelo campo “parent” da seguinte forma:

public List<Category> listAllByParent(Long parent){		
		return this.getSession().createCriteria(Category.class)
							.add(Restrictions.eq("parent", parent)).list();								
}

o hibernate me apresenta a seguinte steak trace:

org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.com.bfree.model.Category.id at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:198) at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:227) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3875) at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3583) at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:203) at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:242) at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456) at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:130) at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1873) at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1844) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1716) at org.hibernate.loader.Loader.doQuery(Loader.java:801) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) at org.hibernate.loader.Loader.doList(Loader.java:2533) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) at org.hibernate.loader.Loader.list(Loader.java:2271) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347) at br.com.barganhafree.dao.CategoryDao.listAllByParent(CategoryDao.java:21) at br.com.barganhafree.dao.CategoryDaoTest.shoulListAllByParent(CategoryDaoTest.java:82) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172) ... 45 more

O curioso é que o hibernate cria a query certinha:

Hibernate: 
    /* criteria query */ select
        this_.id as id5_0_,
        this_.description as descript2_5_0_,
        this_.parent as parent5_0_ 
    from
        Category this_ 
    where
        this_.parent=?

Alguém pode me dizer o por que eu não conseguir fazer esse simples select?

Obrigado.

13 Respostas

A

cara,

no @JoinColumn(name=“parent”) vc tem que colocar o nome da sua chave estrageira, ta certo?

t+

worldsoft

alissonvla:
cara,

no @JoinColumn(name=“parent”) vc tem que colocar o nome da sua chave estrageira, ta certo?

t+

Tá sim.

A

mas ai na imagem que vc postou, sua FK chama Category_id

A

tenta isso aqui

@JoinColumn(name="parent", referencedColumnName = "id")  
    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)     
    public Category getParent() {  
        return parent;  
    }
worldsoft

alissonvla:
tenta isso aqui

@JoinColumn(name="parent", referencedColumnName = "id") @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL) public Category getParent() { return parent; }

Desculpa postei imagem desatualizada, a correta está em anexo.
E quanto a alteração que você falou eu fiz, mais o erro ainda continua.

A

cara,

da uma olhada nesse link http://www.guj.com.br/java/72788-auto-relacionamento-jpa

t+

worldsoft

alissonvla:
cara,

da uma olhada nesse link http://www.guj.com.br/java/72788-auto-relacionamento-jpa

t+

Não tá funcionando.

A

cara,

agora eu to vendo sua pesquisa, tem que ficar assim

public List<Category> listAllByParent(Long parent){         
        return this.getSession().createCriteria(Category.class)  
                            .add(Restrictions.eq("parent.id", parent)).list();                               
}
worldsoft

alissonvla:
cara,

agora eu to vendo sua pesquisa, tem que ficar assim

public List<Category> listAllByParent(Long parent){ return this.getSession().createCriteria(Category.class) .add(Restrictions.eq("parent.id", parent)).list(); }

Alissonv funcionou direitinho véio, agora se você me permitir e peço antecipadamente desculpa por minha ignorância:

O hibernate quando monta minha query eu tenho que passar o objeto.propriedade para ele fazer a consulta?
Ele entende como se fosse um objeto o campo parent?

Obrigado.

A

entao cara,

o hibernate nao é um framework ORM, o que vc ta fazendo, nada mais é que navegando no objeto.
entendeu?

worldsoft

alissonvla:
entao cara,

o hibernate nao é um framework ORM, o que vc ta fazendo, nada mais é que navegando no objeto.
entendeu?

Sim entendi.
Desculpa a pergunta novamente, o hibernate não é ORM? e ele seria o que?

A

é sim, so me expressei de outra forma…rsrs

worldsoft

A tá, entendi.

Obrigado pela ajuda.

Criado 19 de outubro de 2011
Ultima resposta 19 de out. de 2011
Respostas 13
Participantes 2