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]