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

Edson Tirelli tirelli at post.com
Mon Apr 27 16:59:43 EDT 2009


   Chris,

   When you use "==" in a DRL field constraint (not eval), drools always
translates it into an .equals() call.

   Having said that, there might be other problems, since drools must rely
on object identity for some internal data structures... for instance, we use
IdentityMaps for mapping FactHandles and the actual fact objects, etc.

   We would need to test this and see what can be done. Could you please
open a JIRA and attach a test case so that we can reproduce the problem?

   Thanks,
      Edson

2009/4/26 CK <chrisckc at gmail.com>

> Hi,
>
> I'm testing out some simple codes using Hibernate and Drools 5 and I'm
> hitting an issue with hibernate proxy objects.
>
> With the newer version of hibernate, Javassist is used to proxy some
> hibernate objects.  By doing this, hibernate objects essentially cannot use
> == comparisons, which is fine.
>
> However, this is causing issue in equality checks within Drools 5 LHS
> evaluations of hibernate persistent objects.
>
> Let's say for example I have the following Hibernate objects:
>
> class Parent {
>        Child child;
> }
>
> class Child {
>        String name;
> }
>
> normally, if you output Parent.child, it should be Child.class.  But under
> Hibernate, the child property in Parent may be proxied and enhanced with
> Javassist, thus making Parent.child.class to be something like
> "Child_$$_javassist_75".
>
> Inside Drools, in the LHS:
>
> when
>  $child : Child()
>  $parent : Parent(child == $child)
> then
>  ...
> end
>
> Assume that I have insert separate Child instances here that were retrieved
> from an Hibernate query directly.  Assume that I have also inserted Parent
> instances that were retrieved from a separate query without eager fetching.
>  Given this particular case, the above rule would not match even though it
> technically should.  Under normal java code, using equality, the parent's
> child is equal to the child.
>
> According to MVEL language, which Drools LHS may not necessarily be using,
> equality between two objects are compared using values.  Not sure exactly
> what that means.
>
> Either way, this seems to be a rather unfortunate problem for using Drools
> to work with Hibernate objects.  Older hibernate versions didn't cause this
> problem.
>
> It seemed like jBPM had a similar problem according to the following doc:
>
> http://www.jboss.org/community/docs/DOC-11169
>
> Excerpt:
>
>  Object identity and object equality
>
> MAKE SURE TO USE ALWAYS .equals AND NEVER == comparisons in the Java code.
>
> Typically, in the PVM Java objects, we want to use the default object
> identity as the object equality.  But hibernate persistence breaks this
> (even within the scope of one hibernate session) because of the proxies.  So
> we have to apply a trick in order to make the comparison between a
> persistent object and its proxy return true.  See jBPM 3 class EqualsUtil
> for that trick.
>
>
>
> So my question is whether Drools uses equality or identity when it comes to
> comparing values in LHS constraints.  Is there a way to get around this
> issue?
>
> -Chris
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090427/5cc5165b/attachment.html 


More information about the rules-users mailing list