You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Thomas Mahler <th...@web.de> on 2003/08/01 14:25:43 UTC
Re: JDO - Objects fetched from DB are in transient state, not persistent
Hi Ketan,
Ketan Gangatirkar wrote:
>
> Thomas,
>
> I've been stepping through the OBJ JDO and JDORI code. I have
> determined that the PersistenceCapable objects never are assigned a
> StateManager (member jdoStateManager) when they are assembled from a row
> result.
That's exactly the problem! I'm currently researching how to solve this
issue.
> When an object is created and persisted, it does get assigned a
> StateManager, but I see no corresponding assignment for objects fetched
> from the DB.
I does does happen when objects are retrieved by Identity in
OjbStoreManager.fetch.
But it does not happen when loading object via a query or a whole Extent.
I'm currently trying to implement the StateManager assignment in
OjbExtent too. But it's not as easy as I hoped...
I'll need a closer look at the JDORI again...
cheers,
Thomas
> At what point should that be happening?
>
>
> Thomas Mahler wrote:
>
>> Hi Ketan,
>>
>> Ketan Gangatirkar wrote:
>>
>>> All,
>>>
>>> I'm having a problem with objects fetched from the database. All JDOs
>>> are treated as Transient objects when they have just been fetched from
>>> the database. Thus, they don't have object ids (.jdoGetObjectId()
>>> returns null) or a reference to a PM (.jdoGetPersistenceManager()
>>> returns null). obj.jdoIsPersistent() and JDOHelper.isPersistent(obj)
>>> both return false (obviously, since they're the same). As a result,
>>> when I setX() on the objects, the PM does not propagate the changes back
>>> to the database even though the object was just loaded from the
>>> database.
>>
>>
>>
>> Ah, this seems similar to the problem Marko Lahma reported yesterday.
>>
>>
>> I have one test JSP like this (slightly condensed):
>>
>>>
>>> Iterator iterator = pm.getExtent(User.class, false).iterator();
>>> while (iterator.hasNext())
>>> {
>>> User user = (User) iterator.next();
>>> boolean b = JDOHelper.isPersistent(user));
>>> // ....
>>> }
>>>
>>> b is almost always false. Only when user is a newly or recently created
>>> object will it be in the Persistent state. I can fetch it using Extents
>>> or Queries and isPersistent() returns true in that case. At some point,
>>> however, recently inserted objects stop being retrieved as persistent
>>> objects and become like the others. I have not been able to discern a
>>> cause; they seem to "expire" after a few minutes. Restarting Tomcat
>>> will definitely cause retrieved objects to be treated as transient. I
>>> am using "application" type persistence, but from what I could gather
>>> from the documentation, that is supported without any special programmer
>>> support.
>>>
>>> I have seen several mentions in the list archives for this list of
>>> similar problems, but no resolution. Given that the JDO implementation
>>> would be practically useless without being able to update persistent
>>> JDOs, I am certain that this is user error, but after spending a whole
>>> day trying to track this down, I am out of ideas. I would greatly
>>> appreciate a pointer in the right direction.
>>
>>
>>
>> From what you describe I assume it is a bug. I'll try to fix it asap.
>>
>> cheers,
>> Thomas
>>
>>>
>>> More details:
>>>
>>>
>>> As far as configuration goes, I am using default OBJ.properties
>>> settings. I have verified my repository_user.xml and *.jdo files. I am
>>> not using any of the internal tables because I am not using any of the
>>> features for which it is required.
>>>
>>>
>>> Software packages I am using:
>>>
>>> DB-OJB 1.0 RC3 (could not build RC4)
>>>
>>> Tomcat 4.1.something (WinXP)
>>> JDK 1.4.2 (WinXP)
>>> J2EE 1.3.1 (WinXP)
>>> PostgreSQL 7.3.3 (on FreeBSD)
>>>
>>>
>>> Things I have tried:
>>>
>>> Defining my own object id class
>>>
>>> Using a single, static instance of PersistenceManager instead of going
>>> to PersistenceManagerFactory multiple times
>>>
>>> Fiddling with the location of the queries in the transaction
>>>
>>> Obtaining JDOs via Extents vs. Queries
>>>
>>> forcing cache reloads with evict() and refresh()
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-user-help@db.apache.org
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org
Re: JDO - Objects fetched from DB are in transient state, not persistent
Posted by Ketan Gangatirkar <ja...@ketan.org>.
Thomas,
I was wondering if you'd been able to determine the right way to proceed
with this. If I understood correctly before, the JDO layer is broken
and has been for some time. But that can't be right, since other people
are using JDO. Regardless, I hope you find the solution; it's kind of
hard to use JDO when it's read-only :-). Thanks.
Thomas Mahler wrote:
> Hi Ketan,
>
> Ketan Gangatirkar wrote:
>
>>
>> Thomas,
>>
>> I've been stepping through the OBJ JDO and JDORI code. I have
>> determined that the PersistenceCapable objects never are assigned a
>> StateManager (member jdoStateManager) when they are assembled from a
>> row result.
>
>
> That's exactly the problem! I'm currently researching how to solve this
> issue.
>
>> When an object is created and persisted, it does get assigned a
>> StateManager, but I see no corresponding assignment for objects
>> fetched from the DB.
>
>
> I does does happen when objects are retrieved by Identity in
> OjbStoreManager.fetch.
>
> But it does not happen when loading object via a query or a whole Extent.
>
> I'm currently trying to implement the StateManager assignment in
> OjbExtent too. But it's not as easy as I hoped...
>
> I'll need a closer look at the JDORI again...
>
> cheers,
> Thomas
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org