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]
