hi armin, antonio,

will this patch be applied to ojb 1.1 as well ? the tests run without problems.

jakob

Armin Waibel schrieb:


Antonio Gallardo wrote:

Hi Armin!

Thanks for the replies! I was talking with Carlos and we think this is a
bug because we are quering and we will not expect changes on the database
while quering. Suppose someone is using a read-only one (on a CDROM)?

Checking in the RDBMS world, if we ask for:

SELECT count(*) FROM clients where cli_id = null;

The answer is 0 rows. No errors and not touched the Sequence at all.

Few minuts ago, Carlos tested other cases, for example, what could happen
if we are not using a sequence at all?
Answer: In this case, returns null! That is cool. :-D

In conclusion, we found that if we don't use sequences at all then:

if PK=null or PK!=null but the PK value does not match to a table row PK,
then it returns null. So that is what we could expect in the case of using
sequences.


WDYT?

Can you send me some hints, where I can find the classes and I will try to
fix this small problem? ;-)



Have a look at PersistenceBrokerImpl line 1527.

I attached a fix that should work (not tested).

The main problem was Identity class. This class obtain new id's and set the PK values in the persistent object (if PK fields are null). In my opinion this should not happen (bad design), but to change this will be costly.

regards,
Armin


Best Regards,

Antonio Gallardo.


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




------------------------------------------------------------------------

    public Object getObjectByQuery(Query query) throws 
PersistenceBrokerException
    {
        Object result = null;
        if (query instanceof QueryByIdentity)
        {
            // example obj may be an entity or an Identity
            Object obj = query.getExampleObject();
            if (obj instanceof Identity)
            {
                Identity oid = (Identity) obj;
                result = getObjectByIdentity(oid);
            }
            else
            {
                
if(!serviceBrokerHelper().hasNullPKField(getClassDescriptor(obj.getClass()), 
obj))
                {
                    Identity oid = serviceIdentity().buildIdentity(obj);
                    result = getObjectByIdentity(oid);
                }
            }
        }
        else
        {
            Class itemClass = query.getSearchClass();
            ClassDescriptor cld = getClassDescriptor(itemClass);
            /*
            use OJB intern Iterator, thus we are able to close used
            resources instantly
            */
            OJBIterator it = getIteratorFromQuery(query, cld);
            /*
            arminw:
            patch by Andre Clute, instead of taking the first found result
            try to get the first found none null result.
            He wrote:
            I have a situation where an item with a certain criteria is in my
            database twice -- once deleted, and then a non-deleted version of 
it.
            When I do a PB.getObjectByQuery(), the RsIterator get's both results
            from the database, but the first row is the deleted row, so my 
RowReader
            filters it out, and do not get the right result.
            */
            try
            {
                while (result==null && it.hasNext())
                {
                    result = it.next();
                }
            } // make sure that we close the used resources
            finally
            {
                if(it != null) it.releaseDbResources();
            }
        }
        return result;
    }



------------------------------------------------------------------------

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

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



Reply via email to