[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ojb-user
Subject:    Re: another Oracle issue
From:       Armin Waibel <arminw () apache ! org>
Date:       2005-04-20 19:21:02
Message-ID: 4266AB9E.8040606 () apache ! org
[Download RAW message or body]

Hi Bobby,

when using a 1:1 reference OJB always first store the referenced object 
and then the main object. The internal rules used by OJB when storing a 
object are

store all 1:1 references (if auto-update is enabled)
store main object
store 1:n, m:n references (if auto-update is enabled)

Did you check the generated SQL with p6spy? Or could you log the SQL 
with Oracle. You have enabled auto-update so the Organisation object 
should be stored first, then the Person object, so the FK constraint 
from Person to Organisation shouldn't be a problem.

regards,
Armin


Bobby Lawrence wrote:
> I have another issue.
> I have a Person object.
> This object has a reference to an Organization object.
> descriptors:
> 
> <class-descriptor class="org.jlab.mis.apps.mics.valueobjects.Person" 
> table="users">
>    <field-descriptor name="id" column="user_id" jdbc-type="BIGINT" 
> primarykey="true" autoincrement="true" sequence-name="user_seq"/>
>    <field-descriptor name="firstName" column="firstname" 
> jdbc-type="VARCHAR" />
>    <field-descriptor name="lastName" column="lastname" 
> jdbc-type="VARCHAR" />
>    <field-descriptor name="organizationId" column="organization_id" 
> jdbc-type="BIGINT" />
>    <reference-descriptor name="personsOrganization" 
> class-ref="org.jlab.mis.apps.mics.valueobjects.Organization" 
> auto-update="object">
>      <foreignkey field-ref="organizationId" />
>    </reference-descriptor>
>  </class-descriptor>
> 
>  <class-descriptor 
> class="org.jlab.mis.apps.mics.valueobjects.Organization" 
> table="organizations">
>    <field-descriptor name="id" column="organization_id" 
> jdbc-type="BIGINT" primarykey="true" autoincrement="true" 
> sequence-name="organization_seq"/>
>    <field-descriptor name="name" column="organization_name" 
> jdbc-type="VARCHAR"/>
>  </class-descriptor>
> 
> Here is my code for adding a Person:
> 
> public void addPerson(Person person) throws DatasourceException{
>    PersistenceBroker broker = null;
>    try {
>        broker = PersistenceBrokerFactory.defaultPersistenceBroker();
>        broker.beginTransaction();
>        broker.store(person);
>        broker.commitTransaction();
>    }
>    catch(Exception ex){
>        if(broker != null) broker.abortTransaction();
>        throw new DatasourceException("Could not add person", ex);
>    }
>    finally{
>        if (broker != null) broker.close();
>    }
>  }
> 
> 
> My question is this:
> 1) Upon an insert of a Person, the PersistenceBroker inserts an 
> Organization first because of the auto-update="object" attribute.
> I have set up FK constraints on the DB. When the primary key is not set 
> in the object, the PB uses the SequenceManagerNextValImpl to get the 
> next value of the primary key.
> When the broker tries to then insert the person, I get a 
> KeyViolatedException!:
> 
> org.apache.ojb.broker.KeyConstraintViolatedException: SQL failure while 
> insert object data for class org.jlab.mis.apps.mics.valueobjects.Person, 
> PK of the given object is [ id=2906], object was 
> org.jlab.mis.apps.mics.valueobjects.Person personsName='Bobby Lawrence' 
> and organizationId='677', exception message is [ORA-02291: integrity 
> constraint (MICS.USER_ORG_FK) violated - parent key not found.
> 
> It seems that the PersistenceBroker does not set the "organizationId" in 
> the "users" table. The MICS.USER_ORG_FK is an Oracle contraint that 
> checks to make sure that the Organization id exists in the Organizations 
> table.
> What am I doing wrong?
> 

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

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic