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 Guillaume Nodet <gu...@deliasystems.com> on 2004/01/16 11:57:16 UTC
Problem with foreign keys in cvs lastest version
I've got an exception that is thrown when using the lastest version of ojb
in cvs
that did not occured with the labelled RC5. I'm not using batch mode for
this problem:
Caused by: org.apache.ojb.broker.KeyConstraintViolatedException: SQL failure
while insert object data for class com.opti
time.api.datamodel.entity.Unavailability, PK of the given object is [
ida=19], object was com.optitime.api.datamodel.ent
ity.Unavailability@c84051, exception message is [Integrity constraint
violation - no parent UNAVAILABILITIES_FK_4 table:
RESOURCEPROPERTIES in statement [INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,o
pt_beginday,opt_endday,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,res
unavailabilities,actunavailabilities,depunav
ailabilities,propunavailabilities,rsvpunavailabilities) VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ]]: Integrity constrain
t violation - no parent UNAVAILABILITIES_FK_4 table: RESOURCEPROPERTIES in
statement [INSERT INTO unavailabilities (ida,
opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_endday,o
pt_cardid,opt_code,opt_boundsbegin,opt_bound
send,resunavailabilities,actunavailabilities,depunavailabilities,propunavail
abilities,rsvpunavailabilities) VALUES (?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?) ]
at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(Unknown
Source)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown
Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown
Source)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeCollections(Unknown
Source)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown
Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown
Source)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeCollections(Unknown
Source)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown
Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(Unknown
Source)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(Unknown Source)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(Unknown Source)
at
com.optitime.synchronizer6.Synchronizer.mapObjectIntoTables(Synchronizer.jav
a:942)
... 2 more
Here are the p6spy log purged:
INSERT INTO resources
(id,opt_name,opt_cardid,opt_domainid,opt_classname,opt_projectid,opt_agendai
d,opt_capacity,opt_capacitytype,opt_allocationminduration,opt_allocationstep
,opt_vehicle,opt_modifydatestampclientid,opt_modifydatestampclientname,opt_m
odifydatestampdate,opt_modifydatestampcounter,opt_dependencyids) VALUES
('172974','BEAUVAIS
Michel','172975','42','Inspecteur','0','0','-1','1','-1','-1','0','51','sud'
,'2003-09-03','0','#NULL#')
INSERT INTO properties
(ida,opt_name,opt_appname,opt_valuetype,opt_value,resdata,actdata,prjdata,ca
rdproperties,sitedata,depdata,agndata,secdata,matdata,rsvdata) VALUES
('2146','API_DATA','','1','<<OptiTime>>;<<OPT=1>>;','172974','','','','','',
'','','','')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('1','Habilitation','1','CRECEP_DEFECT','')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('2','Habilitation','1','RECH_PT_PRELEV','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('3','Habilitation','1','INTER_DIVERS','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('4','Habilitation','1','OS_SADE','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('5','Habilitation','1','ADM_DIVERS','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('6','Habilitation','1','CONGE','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('7','Habilitation','1','CN','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('8','Habilitation','1','OF','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('9','Habilitation','1','AE_A_PROGRAM','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('10','Habilitation','1','AE_A_FAIRE','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('11','Habilitation','1','BRT_RV','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('12','Habilitation','1','BRT_PV_TRX','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('13','Habilitation','1','REPRISE_ABNT','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('14','Habilitation','1','TRX_APRES_CR','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('15','Habilitation','1','SUIVI_CONCESS','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('16','Habilitation','1','FUITE','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('17','Habilitation','1','SUIVI_SADE','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('18','Habilitation','1','OV','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('19','Habilitation','1','SARP_A_VERIFIER','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('20','Habilitation','1','SARP_SUIVI','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('21','Habilitation','1','RENS_PROJET_CANA','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('22','Habilitation','1','VERIF_BI_PI','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('23','Habilitation','1','INTERV_PROD','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('24','Habilitation','1','INTERV_RESEAU','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('25','Habilitation','1','SIG','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('26','Habilitation','1','INTERCOM','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('27','Habilitation','1','RQE','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('28','Habilitation','1','CL_TURBI_HEBDO','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('29','Habilitation','1','QE_PONCTUELLE','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('30','Habilitation','1','DESINF_CANALO','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('31','Habilitation','1','RINCAGE_APRES_DESINF','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('32','Habilitation','1','PRELEV_APRES_DESINF','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('33','Habilitation','1','RINCAGE_PONCTUEL','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('34','DI_Categorie','1','Differable','172974')
INSERT INTO resourceproperties
(ida,opt_name,opt_valuetype,opt_value,resproperties) VALUES
('35','DI_Categorie','1','Non differable','172974')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('1','3','1','00:00:00','13:00:00','4','4','0','0','2003-08-28','2003-08-29'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('2','3','1','00:00:00','13:00:00','3','3','0','0','2003-08-27','2003-08-28'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('3','3','1','00:00:00','13:00:00','2','2','0','0','2003-08-26','2003-08-27'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('4','3','1','00:00:00','13:00:00','1','1','0','0','2003-08-25','2003-08-26'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('5','3','1','00:00:00','13:00:00','7','7','0','0','2003-08-24','2003-08-25'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('6','3','1','00:00:00','13:00:00','6','6','0','0','2003-08-23','2003-08-24'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('7','3','1','00:00:00','13:00:00','5','5','0','0','2003-08-22','2003-08-23'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('8','3','1','00:00:00','13:00:00','4','4','0','0','2003-08-14','2003-08-15'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('9','3','1','00:00:00','13:00:00','3','3','0','0','2003-08-13','2003-08-14'
,'','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('10','3','1','00:00:00','13:00:00','2','2','0','0','2003-08-12','2003-08-13
','','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('11','3','1','00:00:00','13:00:00','1','1','0','0','2003-08-11','2003-08-12
','','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('12','3','1','00:00:00','13:00:00','7','7','0','0','2003-08-10','2003-08-11
','','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('13','3','1','00:00:00','13:00:00','6','6','0','0','2003-08-09','2003-08-10
','','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('14','3','1','00:00:00','13:00:00','5','5','0','0','2003-08-08','2003-08-09
','','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('15','3','1','00:00:00','13:00:00','4','4','0','0','2003-07-24','2003-07-25
','','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('16','3','1','00:00:00','13:00:00','3','3','0','0','2003-07-23','2003-07-24
','','','','35','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('18','3','1','00:00:00','13:00:00','2','2','0','0','2003-07-22','2003-07-23
','','','','','')
INSERT INTO unavailabilities
(ida,opt_type,opt_periodicity,opt_begintime,opt_endtime,opt_beginday,opt_end
day,opt_cardid,opt_code,opt_boundsbegin,opt_boundsend,resunavailabilities,ac
tunavailabilities,depunavailabilities,propunavailabilities,rsvpunavailabilit
ies) VALUES
('19','3','1','00:00:00','13:00:00','1','1','0','0','2003-07-21','2003-07-22
','','','','36','')
The problem is that considering the object model, the two last inserts
statements should have been executed with a foreign-key index of '35' and
not '' and '36'.
Guillaume
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org
Re: Apologies
Posted by Armin Waibel <ar...@code-au-lait.de>.
Hi Guillaume,
Guillaume Nodet wrote:
> I apologies to all of you and especially to Gopi Nandamuri
> for the mail i posted a few days ago on this mailing list.
> My intention was not to offend Gopi and in fact i
> completely misunderstood his questions. In the future,
> i will pay close attention, before replying to a mail,
> to be sure to have really understood the meaning and to
> be able to give something consistent as a reply.
>
We all make mistakes (except most managers) ;-)
> As a good will and amendment gesture i want to propose the following
> code of a PersistentField that i wrote to solve a problem i had
> with nested fields.
Thanks for this contribution and detailed description (I understand the
problem ;-)). I will add a test for this problem and adopt your fix
ASAP. Thanks!
regards,
Armin
> I think that the problem is not restrained to me.
> The problem arise when using nested objects that can be nulled.
> Actually, when ojb reads the first field of a nested object that is
> null, an instance is created to continue the recursive walk through
> the nested objects, even if the given value to set for the attribute
> is null. So i needed to make two modifications for the process to work.
>
> * first i had overriden the 'set' method of the AbstractPersistentField
> class to early test if the value will not be set. The added test is
> borrowed from the PersistentFieldDirectAccessImpl but is performed
> before having created an instance of the nested object.
>
> public void set(Object targetObject, Object value) throws
> MetadataException
> {
> if (isNestedField())
> {
> if (value != null || !getField().getType().isPrimitive())
> {
> setNestedObject(targetObject, fieldName, value);
> }
> }
> else
> {
> doSet(targetObject, value);
> }
> }
>
>
> * the second modification i did is needed because the test on the 'set'
> method
> works only for primitive types. But if we store a Date for example in a
> nested
> object, it will be nevertheless created. But the test can not extend
> the test
> made earlier, because if we nested objects could have non-null default
> values
> for certain fields. So i overrided the 'setNestedObject' method to
> perform
> the test so that when realizing that the nested object is null, there
> is no need
> to create one to put a null value in the field.
> When the added test 'if (attrib != null || value != null)' is true
> the instanciation and setting of the attribute is skipped.
>
> protected void setNestedObject(Object obj, String fieldName, Object
> value)
> {
> int index = fieldName.indexOf(PATH_TOKEN);
> if (index >= 0)
> {
> String name = fieldName.substring(0, index);
> PersistentField pField =
> createInternPersistentField(ProxyHelper.getRealClass(obj), name);
> Object attrib = pField.get(ProxyHelper.getRealObject(obj));
> if (attrib != null || value != null)
> {
> if (attrib == null)
> {
> .......
> }
> String nestedName = fieldName.substring(index +
> PATH_TOKEN.length());
> setNestedObject(attrib, nestedName, value);
> }
> }
> else
> {
> PersistentField pField =
> createInternPersistentField(ProxyHelper.getRealClass(obj), fieldName);
> pField.set(ProxyHelper.getRealObject(obj), value);
> }
>
> }
>
> Best regards,
>
> Guillaume Nodet
>
>
>
>
>
> ---------------------------------------------------------------------
> 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
Apologies
Posted by Guillaume Nodet <gu...@deliasystems.com>.
I apologies to all of you and especially to Gopi Nandamuri
for the mail i posted a few days ago on this mailing list.
My intention was not to offend Gopi and in fact i
completely misunderstood his questions. In the future,
i will pay close attention, before replying to a mail,
to be sure to have really understood the meaning and to
be able to give something consistent as a reply.
As a good will and amendment gesture i want to propose the following
code of a PersistentField that i wrote to solve a problem i had
with nested fields. I think that the problem is not restrained to me.
The problem arise when using nested objects that can be nulled.
Actually, when ojb reads the first field of a nested object that is
null, an instance is created to continue the recursive walk through
the nested objects, even if the given value to set for the attribute
is null. So i needed to make two modifications for the process to work.
* first i had overriden the 'set' method of the AbstractPersistentField
class to early test if the value will not be set. The added test is
borrowed from the PersistentFieldDirectAccessImpl but is performed
before having created an instance of the nested object.
public void set(Object targetObject, Object value) throws
MetadataException
{
if (isNestedField())
{
if (value != null || !getField().getType().isPrimitive())
{
setNestedObject(targetObject, fieldName, value);
}
}
else
{
doSet(targetObject, value);
}
}
* the second modification i did is needed because the test on the 'set'
method
works only for primitive types. But if we store a Date for example in a
nested
object, it will be nevertheless created. But the test can not extend
the test
made earlier, because if we nested objects could have non-null default
values
for certain fields. So i overrided the 'setNestedObject' method to
perform
the test so that when realizing that the nested object is null, there
is no need
to create one to put a null value in the field.
When the added test 'if (attrib != null || value != null)' is true
the instanciation and setting of the attribute is skipped.
protected void setNestedObject(Object obj, String fieldName, Object
value)
{
int index = fieldName.indexOf(PATH_TOKEN);
if (index >= 0)
{
String name = fieldName.substring(0, index);
PersistentField pField =
createInternPersistentField(ProxyHelper.getRealClass(obj), name);
Object attrib = pField.get(ProxyHelper.getRealObject(obj));
if (attrib != null || value != null)
{
if (attrib == null)
{
.......
}
String nestedName = fieldName.substring(index +
PATH_TOKEN.length());
setNestedObject(attrib, nestedName, value);
}
}
else
{
PersistentField pField =
createInternPersistentField(ProxyHelper.getRealClass(obj), fieldName);
pField.set(ProxyHelper.getRealObject(obj), value);
}
}
Best regards,
Guillaume Nodet
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org