[rules-users] Hibernate proxy objects equality tests failing in Drools 5

Guto guto at guto.net
Wed May 6 08:43:43 EDT 2009


I don´t have a clue why is not working eather.

Unfortunelly I can´t really rely on a.id == b.id ´cause I have rules like:
$participante:Participante() && $participacoes: ArrayList(size == 0) from
collect(ParticipacaoCiclo(participante == $participante && saidaPosto ==
null && periodo == 1 ))

Do eager fetching, will really reduce my perfomace, since most of my
collection properties have a huge amount of data (I don´t use that data
inside the drools session, I don´t need them).

I have 2 clients one is an UnitTest that access the EJB and the other is
an JSF 1.2 webclient (the real application itself). I´m not using groovy
(not in this project, however I found that really interesting).

thanks.

just a question (==) will be translated to (equals) right?




> With the new hibernate jars and the migration to the new Javassist,
> what hibernate is essentially doing is dynamically generating
> hibernate proxy objects that should subclass the original file.
> Here's the interesting part.
>
> In groovy, comparing two hibernate objects:
>
> a.a == b.a
>
> works fine when they are the same type of object.  Under groovy, "=="
> uses "equals()" to do the comparison.  That appears to work all good.
> However, taking these same two objects into Drools and comparing their
> subproperty when they are lazily loaded will cause the problems that
> a.a no longer equals to b.a.  Yet under groovy, it still says they are
> equal.
>
> There could be one of 2-3 things that can be done to fix this, which I
> haven't entirely tried.
>
> 1) implement your own version of equals() and hashCode() and use the
> instanceOf() hibernate util method to do comparison.  Sadly, I have
> over 50 domains objects and I'm hoping not to have to implement all
> the methods.
>
> 2) do a eager fetch of the properties.  This is probably the best and
> easy way, but I am getting this working well under Grails/groovy.
> Somehow it's still fetching them as proxy objects, but just loaded.
> Either that or the eager fetching isn't even working (I've yet to
> fully test this yet with hibernate logging turned on to check).
>
> 3) use each domain's identity or some unique constraint to do the
> equality check.  This is my current "cheating" way of getting around
> the problem.  I simply use a.a.id == b.a.id.  However, this poses an
> additional complexity where I actually have to do null checks for the
> property.  Otherwise, I'd get NPEs all over the place.
>
> At the end of the day, I don't see why Drools cannot see proxy objects
> as equal.  The only way I can think of is that there is some sort of
> direct object/class type check in Drools that's causing it not to
> realize that two objects are equal. But I could be wrong, and I hope
> I'm wrong. :)
>
> -Chris
>
> On May 4, 2009, at 1:29 PM, Guto wrote:
>
>> Thanks Greg,
>>
>> But it´s not a lazy loading problem at all. I am not using any kind of
>> lazy attribute inside the statefull drools session...
>>
>> Unfortunelly, i´ve just upgrade from drools 4GA to 5CR1 and the
>> problem
>> persist. Now I will try to make CLONES of the objects the came from
>> the
>> bank, just to see if that (temporary) solution works.
>>
>>>
>>> Do you need the lazy loading functionality that proxies provide?
>>> It seems
>>> to me that if you have an EJB call that's providing the objects
>>> loaded
>>> from hibernate, that's probably not the case. (i.e. once the
>>> objects are
>>> loaded and returned by the EJB method, the hibernate session may no
>>> longer
>>> be available, so lazy loading could fail anyway.)  If you have
>>> access to
>>> the hibernate mapping just set lazy="false" on your class mappings.
>>>
>>> Not to say that this use case shouldn't be addressed with drools,
>>> but if
>>> you're under a deadline... :)
>>>
>>> --- On Mon, 5/4/09, Guto <guto at guto.net> wrote:
>>>
>>>> From: Guto <guto at guto.net>
>>>> Subject: Re: [rules-users] Hibernate proxy objects equality tests
>>>> failing   in Drools 5
>>>> To: "Rules Users List" <rules-users at lists.jboss.org>
>>>> Date: Monday, May 4, 2009, 2:42 PM
>>>> Just now I notice one thing. The application that i am
>>>> building is
>>>> compleatly EJB centric. I have um EJB project that usually
>>>> do all the
>>>> database stuff, and another EJB project for the drools
>>>> rules. Lets call
>>>> them
>>>> EJB-DATA and EJB-DROOLS. When the client calls for an
>>>> specific data that
>>>> must be threated thru the Drools rules it calls an
>>>> Stateless method from
>>>> EJB-DATA, inside the method, it gather the necessarie
>>>> parameter
>>>> information and them inside the EJB-DATA method it calls
>>>> the EJB-DROOLS.
>>>> (hoping not been confusing)
>>>>
>>>> (if you are using an fixed space font, here comes the
>>>> sequence)
>>>>
>>>> Client --> EJB-DATA (gather information inside) -->
>>>> EJB-DROOLS
>>>>       <-- return to Client data from EJB-DROOLS<--
>>>> return to EJB-DATA
>>>>
>>>> Now looking over my two projects, I notice that I make them
>>>> apart so one
>>>> could evolve with interfering the other.
>>>>
>>>> When I call EJB-DROOLS directly from an UNIT-TEST client
>>>> with pojos
>>>> parameters intantiated by the test, it pass.
>>>>
>>>> When I call EJB-DATA from an UNIT-TEST client (pojos
>>>> created inside this),
>>>> first i was getting an CORBA exception ´cause of a
>>>> ClassNotFoundException
>>>> for the hibernate PersistenceBag.
>>>>
>>>> That´s the way i figure out that my objects are bagged or
>>>> proxied thru
>>>> hibernate.
>>>>
>>>> I´ve tried to use the EntityManager.clear() (EJB3-JPA) to
>>>> clean the pojos
>>>> before send it and make them more like the ones from the
>>>> first unit-test,
>>>> but even so it´s not working.
>>>>
>>>> Then, possible solutions:
>>>> 1) Make equality test works from objects that came from
>>>> hibernate from jpa.
>>>> 2) Kill the proxies and make them simple objects (not
>>>> hibernate derivated).
>>>> 3) don´t know, but i´m been realy in a deadline here.
>>>>
>>>>
>>>> again
>>>> thanks for anyone in advance !
>>>>
>>>> --
>>>> Guto Maia
>>>> Consultor de TI / Desenvolvedor
>>>> CSM - SCJP- SCWCD - SCBCD - ZCE
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>> In fact, i´m really using JPA with hibernate as an
>>>> provider.
>>>>>
>>>>> Could you send me your hibernate config? I will
>>>> compare some proprieties
>>>>> of tyour hibernate.config with my persistence.xml.
>>>>>
>>>>> I plenty sure that the rule is ok, since it is working
>>>> with the unit test.
>>>>>
>>>>> If you need any help to mimic what your using with
>>>> JPA, just ask.
>>>>>
>>>>> Thanks anyway.
>>>>>
>>>>>
>>>>>>
>>>>>> I'm using non-proxied hibernate backed POJOs
>>>> in drools with no problems.
>>>>>> (THe pojos aer generaed by hbm2java.)  I'll
>>>> try configuring for proxies
>>>>>> to
>>>>>> see what happens.
>>>>>>
>>>>>>
>>>>>> --- On Mon, 5/4/09, Gustavo Maia Neto
>>>> <guto at guto.net> wrote:
>>>>>>
>>>>>>> From: Gustavo Maia Neto <guto at guto.net>
>>>>>>> Subject: Re: [rules-users] Hibernate proxy
>>>> objects equality tests
>>>>>>> failing in Drools 5
>>>>>>> To: "Rules Users List"
>>>> <rules-users at lists.jboss.org>
>>>>>>> Date: Monday, May 4, 2009, 11:28 AM
>>>>>>> on this afternoon I will migrate to Drools 5
>>>> CR1,
>>>>>>> unfortunelly i'm not
>>>>>>> sure if it will solve my problem.
>>>>>>>
>>>>>>> Does anyone else uses Drools with objects that
>>>> came from an
>>>>>>> hibernate,
>>>>>>> (proxies)?
>>>>>>>
>>>>>>> Also, i'm not using any proxy to fetch
>>>> lazy data inside
>>>>>>> my Drools
>>>>>>> stateful session.
>>>>>>>
>>>>>>> thanks
>>>>>>>
>>>>>>> Guto escreveu:
>>>>>>>> I was following that subject on markmail,
>>>> and them
>>>>>>> I've enterred the
>>>>>>>> user-group (so subject and body are
>>>> coppied from
>>>>>>> them). I've got the
>>>>>>>> exactly same problem. When I use the
>>>> rules with
>>>>>>> objects the came from the
>>>>>>>> database (thru JPA hibernate provider),
>>>> thouse rules
>>>>>>> never match. When I
>>>>>>>> do the same from Pojos hand made for unit
>>>> test, it
>>>>>>> work.
>>>>>>>>
>>>>>>>> I don't know what really happen, but
>>>> i'm sure
>>>>>>> that it is an equality test
>>>>>>>> falling 'cause of the hibernate
>>>> proxys.
>>>>>>>>
>>>>>>>> I don't get also any kind of error or
>>>> exception,
>>>>>>> since it ALL WORK. Just
>>>>>>>> the rule isn't be acomplished.
>>>>>>>>
>>>>>>>> I'm using EJB3 + JPA (hibernate
>>>> provider) and
>>>>>>> Drools 4 GA;
>>>>>>>>
>>>>>>>> thanks in advance for any help
>>>>>>>>
>>>>>>>
>>>>>>>
>>>> _______________________________________________
>>>>>>> rules-users mailing list
>>>>>>> rules-users at lists.jboss.org
>>>>>>>
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> rules-users mailing list
>>>>>> rules-users at lists.jboss.org
>>>>>>
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Guto Maia
>>>>> Consultor de TI / Desenvolvedor
>>>>> CSM - SCJP- SCWCD - SCBCD - ZCE
>>>>>
>>>>> _______________________________________________
>>>>> rules-users mailing list
>>>>> rules-users at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>>
>> --
>> Guto Maia
>> Consultor de TI / Desenvolvedor
>> CSM - SCJP- SCWCD - SCBCD - ZCE
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
> .
>


-- 
Guto Maia
Consultor de TI / Desenvolvedor
CSM - SCJP- SCWCD - SCBCD - ZCE




More information about the rules-users mailing list