Armin, after your request to post to the user group, I
am doing that, even though I thought last time that if
I clicked the reply at the bottom it would
automatically be posted to the newsgroup. Silly me. :)

Anyway, here is my original question and with it the
additional info you asked for. Anybody else who has
maybe had these problems, feel free to enlighten me.
:)


OJB VERSION: 1.0.3
MAPPING FOR PERSON AND PERSON_CONTAINER:
***************************************************
<!-- file containing the repository descriptions for
user-defined types -->
<!-- Generated by the xdoclet-ojb module -->
<class-descriptor
    class="Person"
    table="Person"
>
    <field-descriptor
        name="mName"
        column="mName"
        jdbc-type="VARCHAR"
        length="254"
    >
    </field-descriptor>
    <field-descriptor
        name="mPersonId"
        column="mPersonId"
        jdbc-type="INTEGER"
        primarykey="true"
    >
    </field-descriptor>
    <field-descriptor
        name="mParentPersonId"
        column="mParentPersonId"
        jdbc-type="INTEGER"
    >
    </field-descriptor>
    <field-descriptor
        name="mPersonKey"
        column="mPersonKey"
        jdbc-type="VARCHAR"
        length="254"
    >
    </field-descriptor>
    <field-descriptor
        name="mContainerId"
        column="mContainerId"
        jdbc-type="INTEGER"
    >
    </field-descriptor>
</class-descriptor>
<class-descriptor
    class="PersonContainer"
    table="PersonContainer"
>
    <field-descriptor
        name="mId"
        column="mId"
        jdbc-type="INTEGER"
        primarykey="true"
        autoincrement="true"
    >
    </field-descriptor>
    <field-descriptor
        name="mName"
        column="mName"
        jdbc-type="VARCHAR"
        length="254"
    >
    </field-descriptor>
    <field-descriptor
        name="mDescription"
        column="mDescription"
        jdbc-type="VARCHAR"
        length="254"
    >
    </field-descriptor>
    <collection-descriptor
        name="mPersons"
        element-class-ref="Person"
        auto-retrieve="true"
        auto-update="object"
        auto-delete="object"
    >
        <inverse-foreignkey field-ref="mContainerId"/>
    </collection-descriptor>
**************************************************

JDBC CONNECTION DESCRIPTOR:
*************************************************
 <!-- this connection was used as the default one
within OJB -->
    <jdbc-connection-descriptor
                jcd-alias="default"
                default-connection="true"
                platform="Oracle"
                jdbc-level="3.0"
                driver="oracle.jdbc.driver.OracleDriver"
                protocol="jdbc"
                subprotocol="oracle"
                dbalias="thin:@cetus.contecint.com.au:1521:alex"
                username="alex"
                password="alex"
                batch-mode="false"
        useAutoCommit="1"
        ignoreAutoCommitExceptions="false"
     >

        <!-- alternative cache implementations, see
docs section "Caching" -->
        <object-cache
class="org.apache.ojb.broker.cache.ObjectCacheTwoLevelImpl">
            <!-- meaning of attributes, please see
docs section "Caching" -->
            <!-- common attributes -->
            <attribute attribute-name="cacheExcludes"
attribute-value=""/>
            <!-- ObjectCacheTwoLevelImpl attributes
-->
            <attribute
attribute-name="applicationCache"
attribute-value="org.apache.ojb.broker.cache.ObjectCacheDefaultImpl"/>
            <attribute attribute-name="copyStrategy"
attribute-value="org.apache.ojb.broker.cache.ObjectCacheTwoLevelImpl$CopyStrategyImpl"/>
            <!-- ObjectCacheDefaultImpl attributes -->
            <attribute attribute-name="timeout"
attribute-value="900"/>
            <attribute attribute-name="autoSync"
attribute-value="true"/>
            <attribute attribute-name="cachingKeyType"
attribute-value="0"/>
            <attribute
attribute-name="useSoftReferences"
attribute-value="true"/>
        </object-cache>

        <!-- more info, see section "Connection
Handling" in docs -->
        <connection-pool
            maxActive="30"
            validationQuery=""
            testOnBorrow="true"
            testOnReturn="false"
            whenExhaustedAction="0"
            maxWait="10000"
        />

        <!-- alternative sequence manager
implementations, see docs section "Sequence Manager"
-->
        <sequence-manager
className="org.apache.ojb.broker.util.sequence.SequenceManagerHighLowImpl">
            <!-- meaning of attributes, please see
docs section "Sequence Manager" -->
            <attribute attribute-name="grabSize"
attribute-value="20"/>
            <attribute attribute-name="autoNaming"
attribute-value="true"/>
            <attribute attribute-name="sequenceStart"
attribute-value="0"/>
            <attribute
attribute-name="globalSequenceId"
attribute-value="false"/>
        </sequence-manager>
   </jdbc-connection-descriptor>

***************************************************



THE ORIGINAL QUESTION:

> BUT, I do have another problem now. When I am adding
a
> new PersonContainer, I add some Persons to it and
try
> to write it to the database but I get an exception.
> 
> Here is the code:
> 
> ==================================================
> public void enterNewPersonContainer(PersonContainer
> container)
> {
> Transaction tx2 = odmg.newTransaction();
>         Database db = odmg.getDatabase(null); //the
> current DB
>         
>         tx2.begin();
>         //broker.commitTransaction();
>         // 4. make persistent new object
>         db.makePersistent(container);
> 
>         // 5. commit transaction
>         tx2.commit();
> }
> =============================================
> 




> Note that PersonContainer is a new container with
> several persons added to it's internal collection.
> The exception I get is the following:
> 
> ==================================================
> org.apache.ojb.odmg.TransactionImpl] ERROR: Could
not
> prepare for commit: SQL failure while insert object
> data for class Person, PK of the given object is [
> mPersonId=1], object was [1] person                 
 
>  PersonKey: key           ParentId: 0, exception
> message is [ORA-00001: unique constraint
> (ALEX.PERSON_PK) violated
> ], SQL code [23000]
> [org.apache.ojb.odmg.TransactionImpl] ERROR: Error
> while commit objects, do abort tx
> [EMAIL PROTECTED], SQL
> failure while insert object data for class Person,
PK
> of the given object is [ mPersonId=1], object was
[1]
> person                      PersonKey: key          
> ParentId: 0, exception message is [ORA-00001: unique
> constraint (ALEX.PERSON_PK) violated
> ], SQL code [23000]
> SQL failure while insert object data for class
Person,
> PK of the given object is [ mPersonId=1], object was
> [1] person                      PersonKey: key      
 
>     ParentId: 0, exception message is [ORA-00001:
> unique constraint (ALEX.PERSON_PK) violated
> ], SQL code [23000]
>
org.apache.ojb.broker.KeyConstraintViolatedException:
> SQL failure while insert object data for class
Person,
> PK of the given object is [ mPersonId=1], object was
> [1] person                 PersonKey: key          
> ParentId: 0, exception message is [ORA-00001: unique
> constraint (ALEX.PERSON_PK) violated
> ], SQL code [23000]
>         at
> 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:266)
>         at
> 
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBrokerImpl.java:1754)
>         at
> 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:813)
>         at
> 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:1687)
>         at
> 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:181)
>         at
> 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:181)
>         at
>
org.apache.ojb.odmg.ObjectEnvelope.doInsert(ObjectEnvelope.java:739)
>         at
> 
org.apache.ojb.odmg.states.StateNewDirty.commit(StateNewDirty.java:106)
>         at
> 
org.apache.ojb.odmg.ObjectEnvelopeTable.writeAllEnvelopes(ObjectEnvelopeTable.java:243)
>         at
> 
org.apache.ojb.odmg.ObjectEnvelopeTable.writeObjects(ObjectEnvelopeTable.java:185)
>         at
> 
org.apache.ojb.odmg.TransactionImpl.doWriteObjects(TransactionImpl.java:370)
>         at
> 
org.apache.ojb.odmg.TransactionImpl.prepareCommit(TransactionImpl.java:687)
>         at
>
org.apache.ojb.odmg.TransactionImpl.commit(TransactionImpl.java:623)
>         at
> 
TransactionHandler.enterNewModelContainer(TransactionHandler.java:419)
>         at
> 
TransactionHandler.enterNewModelContainer(TransactionHandler.java:388)
>         at Main.run(Main.java:157)
>         at Main.main(Main.java:36)
> Caused by: java.sql.SQLException: ORA-00001: unique
> constraint (ALEX.MODEL_PK) violated
> 
>         at
> 
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
>         at
>
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
>         at
>
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
>         at
>
oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:626)
>         at
> 
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:182)
>         at
> 
oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:792)
>         at
> 
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1033)
>         at
> 
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2885)
>         at
> 
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2957)
>         at
> 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:216)
>         ... 16 more
> ====================================================
> 
> 
> The problem seems to be the fact that it is trying
to
> enter the person before the personcontainer.
> I managed to get around it by doing this:
> 
> ===================================================
> public void enterNewPerson(PersonContainer
container)
> {
>        TransactionExt tx =
> (TransactionExt)odmg.newTransaction();
>         Database db = odmg.getDatabase(null); //the
> current DB
>         
>         tx.begin();
>         PersistenceBroker broker = tx.getBroker();
>         broker.beginTransaction();
>         broker.store(container);
>         
>        Iterator it =
> container.getPersons().iterator();
> 
>         while( it.hasNext())
>         {
>             Object person = it.next();
>             broker.store(person);
>         }
>         broker.serviceBrokerHelper().link(container,
> true);
> 
>         broker.commitTransaction();
>         // 4. make persistent new object
>         db.makePersistent(container);
> 
>         tx.commit();
> }
> ==================================================
> 
> 
> I would however like to be able to do this in an
> easier way, if possible of course, rather than
looping
> through all the persons, commiting them and then
> commiting the container. And I would like to stick
to
> using odmg api, if possible.
> 
> Is there a way to do this?
> 
> 
> p.s. Sorry if my formatting is bad, I am trying to
> improve it since I haven't used these kinds of
mailing
> lists before.
> 
> 
> Thank you.


        

        
                
____________________________________________________ 
Do you Yahoo!? 
Yahoo! Photos: Now with unlimited storage 
http://au.photos.yahoo.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to