Olá Grupo!
Na minha aplicação, no momento em que vou fazer uma busca no banco de dados usando o Hibernate estou recebendo um erro. Que é o seguinte:
Caused by: gfi.dao.DAOException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of gfi.dominio.Despesa.setParcelas
at gfi.dao.DespesaDAO.obterDespesasPagar(DespesaDAO.java:130)
at gfi.modelo.DespesaModelo.obterDespesasPagar(DespesaModelo.java:103)
... 28 more
Caused by: org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of gfi.dominio.Despesa.setParcelas
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:215)
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:185)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3232)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:126)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2150)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:369)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:300)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1127)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at gfi.dao.DespesaDAO.obterDespesasPagar(DespesaDAO.java:127)
... 29 more
Caused by: net.sf.cglib.beans.BulkBeanException: illegal access to loading collection
at gfi.dominio.Despesa$$BulkBeanByCGLIB$$8a1697d4.setPropertyValues(<generated>)
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:212)
... 44 more
Caused by: org.hibernate.LazyInitializationException: illegal access to loading collection
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:138)
at gfi.dominio.Despesa.setParcelas(Despesa.java:83)
... 46 more
A idéia é a seguinte:
Uma Despesa tem 0-N Parcelas…
Os mapeamentos são assim:
Despesa.hbm.xml
<hibernate-mapping>
<class name="gfi.dominio.Despesa">
<id name="idDespesa" column="idDespesa">
<generator class="identity"></generator>
</id>
<property name="descricao"/>
<property name="quantidade" />
<property name="valor" />
<property name="dataCadastro" />
<property name="idStatus" />
<property name="vitalicia" />
<many-to-one name="tipoDespesa" class="gfi.dominio.TipoDespesa" column="idTipoDespesa" lazy="false"/>
<many-to-one name="periodicidade" class="gfi.dominio.Periodicidade" column="idPeriodicidade" lazy="false" />
<set name="parcelas" table="ParcelaDespesa" lazy="true" cascade="all-delete-orphan" order-by="idParcelaDespesa asc" inverse="true">
<key column="idDespesa" update="false" />
<one-to-many class="gfi.dominio.ParcelaDespesa" />
</set>
</class>
</hibernate-mapping>
ParcelaDespesa.hbm.xml
<hibernate-mapping>
<class name="gfi.dominio.ParcelaDespesa">
<composite-id name="parcelaDespesaPK" class="gfi.dominio.ParcelaDespesaPK">
<key-property name="idParcelaDespesa" />
<key-many-to-one name="despesa" class="gfi.dominio.Despesa" column="idDespesa" />
</composite-id>
<property name="dataVencimento" />
<property name="valor" />
<property name="idStatus" />
</class>
</hibernate-mapping>
A busca no meu DespesaDAO é assim:
StringBuilder hql = new StringBuilder();
hql.append("from Despesa d left join fetch d.parcelas p ");
hql.append("where (d.idStatus IN ('NP','PP') or p.idStatus IN ('NP','PP')) ");
hql.append("and ( (d.dataCadastro between :dataInicio and :dataFim) or (p.dataVencimento between :dataInicio and :dataFim) )");
Query query = session.createQuery(hql.toString());
query.setDate("dataInicio", dataInicio);
query.setDate("dataFim", dataFim);
return query.list();
Se alguém puder me dar uma ajuda, será bem vinda…
Abraços!
Ramon