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

Greg Barton greg_barton at yahoo.com
Wed May 6 13:42:10 EDT 2009


You can't do "participante.id == $participante.id "?

--- On Wed, 5/6/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: Wednesday, May 6, 2009, 7:43 AM
> 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
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users


      




More information about the rules-users mailing list