Hi Nikolaus,

This is copied from ObjectCacheDefaultImpl:

    private Integer buildKey(Identity oid)
    {
        int key = 0;
        switch(cachingKeyType)
        {
            case 0:
                key = oid.hashCode();
                break;
            case 1:
                key = new
HashCodeBuilder().append(broker.getPBKey().getAlias().hashCode()).append(oid.hashCode()).toHashCode();
                break;
            case 2:
                key = new
HashCodeBuilder().append(broker.getDescriptorRepository().hashCode()).append(oid.hashCode()).toHashCode();
                break;
            case 3:
                key = new
HashCodeBuilder().append(broker.getDescriptorRepository().hashCode()).append(broker.getPBKey().getAlias().hashCode()).append(oid.hashCode()).toHashCode();
                break;
            default:
                throw new OJBRuntimeException("Unexpected error, 'cacheType
="+cachingKeyType+"' was not supported");
        }
        return new Integer(key);
    }


It is interesting that someone finally discovered this bug in action. Indeed
OJB's latest object cache implementations use an object based on the PK's
hashCode() as keys into a Hashtable. Since hash codes of different objects can
be equal, this sooner or later had to fail.

We are using own ObjectCache implementations for some other reasons but stumbled
about this when adapting our caches to version 1.0.1. I always wanted to post
something about this problem to the list, but, alas, I forgot about it.

If you are using the default cache setting, you can simply change the buildKey
method to return an Object, namely oid itself. If you are using one of the other
options I can post a utility class that combines several objects to a single
hash table key and you can use this in your ObjectCache. Let me know.

But of course I hope someone of the OJB gurus will fix this in the official
code...

Gerhard

On Thu, 18 Nov 2004 15:55:41 +0100, [EMAIL PROTECTED]
wrote:

>
>
>
>
>Hi,
>
>i am using OJB since 1 and 1/2 years. This week i tried to move from
>Version 1.0 to 1.0.1.
>
>I detected the following problem:
>
>I have two objects of two different classes (aClass and bClass) with the
>same base class.
>I use strings as primary keys. Object a has the string 'WR' as pk, object b
>the string 'X3'.
>If i first search for object of aClass with objectId = WR and then for
>object of bClass with objectID = X3, i retrieve the object a two times.
>
>The reason seems to be that both strings are mapped two the same Integer in
>org.apache.ojb.broker.Identity.hashCode()
>
>This behaviour of the Object Cache was not in OJB 1.0.
>
>Is this a known problem in OBJ 1.0.1?
>
>Best regards
>
>Nikolaus Bininda.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to