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 Gary Bartlett <ga...@yahoo.com> on 2006/07/30 01:45:13 UTC

Ability to access primary key prior to Store of Object

Greetings

I am working on upgrading an application that was
built using OJB 0.94 to release 1.0.4.  I am running
into some difficulties getting a primary key assigned
for a newly created persistent object before the
object is actually stored into the database.

Under 0.94 it seemed I could just create a new
instance of my persistent object and then call 

      Identity id = new Identity(object);

passing the newly created object.

I did not have to do anything with the returned
Identity (id) --- but a side effect of calling this
was that the primaryKey of the newly created object
was populated.

In 1.04 the above call is not available - so I changed
it to 

        Identity id = new
IdentityFactoryImpl(getBroker()).buildIdentity(object);

This does not seem to have the same side effect - and
I am unsure if I can even get the primaryKey from the
returned Identity.

So I guess my question is whether or not there is a
way to get a primaryKey for a newly created object
prior to the object being stored into the database.

Thanks,

Gary Bartlett





__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: Ability to access primary key prior to Store of Object

Posted by Armin Waibel <ar...@apache.org>.
Hi Gary,

Gary Bartlett wrote:
> Greetings
> 
> I am working on upgrading an application that was
> built using OJB 0.94 to release 1.0.4.  I am running
> into some difficulties getting a primary key assigned
> for a newly created persistent object before the
> object is actually stored into the database.
> 
> Under 0.94 it seemed I could just create a new
> instance of my persistent object and then call 
> 
>       Identity id = new Identity(object);
> 
> passing the newly created object.
> 
> I did not have to do anything with the returned
> Identity (id) --- but a side effect of calling this
> was that the primaryKey of the newly created object
> was populated.
> 
> In 1.04 the above call is not available - so I changed
> it to 
> 
>         Identity id = new
> IdentityFactoryImpl(getBroker()).buildIdentity(object);
> 
> This does not seem to have the same side effect - and
> I am unsure if I can even get the primaryKey from the
> returned Identity.
> 

this was my fault. To fix a serious bug we have to change/harmonize the
behavior of Identity creation and I forget to document this change in 1.0.4.
It's no longer possible to assign the PK of an object before insert.
After insert of the object you can use the IdentityFactory to build
Identity objects.
Below I post the upcoming (OJB 1.0.5) corrected section in "sequence
manager" docs:

<snip>

To harmonize the behavior of OJB when using different SequenceManager
implementations and to solve a problem with "table per
subclass"-inheritance  we restrict the early id association in newer
versions of OJB.

since OJB 1.0.4
---------------
OJB no longer assign the PK values of transient objects on creation of
the Identity objects (using IdentityFactory). The Identity object of a
transient persistence capable object is completely independent of the
"real" primary key assigned on insert of the object - when calling

Identity oid = broker.serviceIdentity().buildIdentity(object);

the specified persistence capable object will not be modified and the
returned Identity object use transient primary key placeholder.

The reason for doing this was to "harmonize" the behavior of OJB when
using different sequence generation strategies.
E.g. when using database based identity columns (supported by MySQL,
MsSQL, HSQL, ...) it's not possible to lookup the generated PK value
before the object is written to database.

</snip>


> So I guess my question is whether or not there is a
> way to get a primaryKey for a newly created object
> prior to the object being stored into the database.
> 

Only at one's own risk. You can use:
e.g.
Identity id = new Identity(object, broker);
broker.store(ObjectModification.INSERT, object);

this should assign the PK values of 'object' before store (for all non 
database identity column based SequenceManager implementations).

but recommended usage is:
e.g.
broker.store(ObjectModification.INSERT, object);
Identity oid = broker.serviceIdentity().buildIdentity(object);

http://db.apache.org/ojb/docu/tutorials/pb-tutorial.html#Find+object+by+primary+key

regards,
Armin

> Thanks,
> 
> Gary Bartlett
> 
> 
> 
> 
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com 
> 
> ---------------------------------------------------------------------
> 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: Ability to access primary key prior to Store of Object

Posted by Vasily Ivanov <ba...@gmail.com>.
Hi Gary,

Have a look here:
http://db.apache.org/ojb/docu/guides/basic-technique.html#Link+references

Cheers,
  Vasily

On 7/30/06, Gary Bartlett <ga...@yahoo.com> wrote:
> Greetings
>
> I am working on upgrading an application that was
> built using OJB 0.94 to release 1.0.4.  I am running
> into some difficulties getting a primary key assigned
> for a newly created persistent object before the
> object is actually stored into the database.
>
> Under 0.94 it seemed I could just create a new
> instance of my persistent object and then call
>
>       Identity id = new Identity(object);
>
> passing the newly created object.
>
> I did not have to do anything with the returned
> Identity (id) --- but a side effect of calling this
> was that the primaryKey of the newly created object
> was populated.
>
> In 1.04 the above call is not available - so I changed
> it to
>
>         Identity id = new
> IdentityFactoryImpl(getBroker()).buildIdentity(object);
>
> This does not seem to have the same side effect - and
> I am unsure if I can even get the primaryKey from the
> returned Identity.
>
> So I guess my question is whether or not there is a
> way to get a primaryKey for a newly created object
> prior to the object being stored into the database.
>
> Thanks,
>
> Gary Bartlett
>
>
>
>
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
>
> ---------------------------------------------------------------------
> 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