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]
