Re: question about storing objects

Armin Waibel <[email protected]> Fri, 16 May 2008 18:58:43 +0200
Newsgroups gmane.comp.jakarta.ojb.user
Message-ID <[email protected]>
Abid Hussain wrote:
> Hi Armin,
> 
> thanks for help.
> 
> Just to be sure that I got the point: When there is a 'proxy="dynamic"' 
> in the class-descriptor, proxies are always used when more than one 
> object is queried?

The returned persistence capable object is always a proxy object, even 
if the query result returns a single object.
In my opinion using a proxy on class-descriptor level (persistence 
capable object proxy) doesn't give much advantage, because OJB always 
perform the full query and only materialize the object identity from the 
result set.

> 
> I thought that proxies are only used when retrieving a collection 
> through a relation (1:n or m:n, e.g. ShoppingCart.getArticles() - see 
> below)...
>

If you declare proxy="true" on collection-/reference-descriptor level 
(1:1, 1:n or m:n relation) then yes you are right.

regards,
Armin


> Regards,
> 
> Abid
> 
> Armin Waibel schrieb:
>> Hi Abid,
>>
>> Abid Hussain wrote:
>>> Hi again,
>>>
>>> I think this issue has to something with the materialization of 
>>> objects (when using proxies). But I thought that proxies are only 
>>> used, when retrieving a corresponding collection of an object (in 1:n 
>>> and m:n relations, e.g. ShoppingCart.getArticles()...).
>>>
>>> What I'm doing when using findAll() (see below) is something like 
>>> SELECT * FROM <tablename>. I thought, in this case no proxies are 
>>> used???
>>>
>>
>> You are using dynamic proxies for all Account_2 objects:
>>
>> <class-descriptor class="modulverwaltung.beans.Account_2"
>>     table="ACCOUNT_2" proxy="dynamic">
>>
>> The query result collection isn't a proxy object. Instead each result 
>> object is a proxy object of persistence capable object (Account_2 
>> object). In most cases this doesn't have an performance advantage.
>>
>> If you now store each of these objects without materialization (e.g. 
>> your log.debug() force the materialization of the object) OJB thinks 
>> that the object didn't change and skip the update.
>>
>> regards,
>> Armin
>>
>>
>>> Regards,
>>>
>>> Abid
>>>
>>>
>>> Abid Hussain schrieb:
>>>> Hi everybody,
>>>>
>>>> I have written a storeAll()-method in a dao to store all given 
>>>> objects in one transaction (you find the code at the end of this mail).
>>>>
>>>> Now please have a look at the following lines of code:
>>>> Account_2DAO dao1 = new Account_2DAO("DB1");
>>>> Collection<Account_2> accounts = dao1.findAll(Account_2.class);
>>>> logger.debug(accounts);
>>>> Account_2DAO dao2 = new Account_2DAO("DB2");
>>>> dao2.storeAll(accounts);
>>>>
>>>> As you see, that there are two daos initialized. The first (dao1) 
>>>> retrieves all objects (using findAll()) from a database (DB1). The 
>>>> second (dao2) stores all retrieved objects into another database (DB2).
>>>> The findAll()-method works fine.
>>>>
>>>> But the storeAll()-method only works when the line of code
>>>> logger.debug(accounts);
>>>> is called. If not, no data is inserted.
>>>>
>>>> Any ideas what's going wrong (you find the class-descriptor file 
>>>> below)?
>>>>
>>>> Regards,
>>>>
>>>> Abid
>>>>
>>>>
>>>> Code of storeAll():
>>>> public void storeAll(Collection<T> valueObjects)
>>>>         throws PersistentStoringException {
>>>>
>>>>     if (valueObjects != null) {
>>>>         try {
>>>>             broker.beginTransaction();
>>>>             for (T valueObject : valueObjects) {
>>>>                 broker.store(valueObject, ObjectModification.INSERT);
>>>>             }
>>>>             broker.commitTransaction();
>>>>         } catch (Exception e) {
>>>>             broker.abortTransaction();
>>>>             throw new PersistentStoringException(
>>>>                     "Error while storing objects.\n" + e);
>>>>         } finally {
>>>>             if (broker != null && !broker.isClosed())
>>>>                 broker.close();
>>>>         }
>>>>     }
>>>> }
>>>>
>>>> Class-descriptor of Account_2:
>>>> <class-descriptor class="modulverwaltung.beans.Account_2"
>>>>     table="ACCOUNT_2" proxy="dynamic">
>>>>     <field-descriptor name="id" column="ID" primarykey="true"
>>>>         autoincrement="true" sequence-name="Account_Id_Seq" />
>>>>     <field-descriptor name="username" column="Username"
>>>>         jdbc-type="VARCHAR" />
>>>>     <field-descriptor name="role" column="Rolle" jdbc-type="VARCHAR" />
>>>> </class-descriptor>
>>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>