Hi,

not sure that I understand the problem.

Each User has two Address attributes ('home' and 'work'), both are of the same type 'Address' (both 1:1 references), you don't use extension classes AddressHome and AddressWork objects. Address use a composite PK ('login' and 'type').

In this case each reference has to use a composite FK key too.

in User (assume the 'login' datatype is INTEGER and User use an autoincrement PK, only show mapping for the 'home' reference, 'work' will be the same):

You need a FK field for each PK value of the referenced object, if you use 'anonymous' fields, you don't need a "real" fields in your persistent object class (User) - more info see docs.
http://db.apache.org/ojb/docu/guides/advanced-technique.html#How+do+


<field-descriptor
             name="fkLoginHome"
             column="FK_LOGIN_HOME"
             jdbc-type="INTEGER"
            access="anonymous"
        />
<field-descriptor
             name="fkTypeHome"
             column="FK_TYPE_HOME"
             jdbc-type="VARCHAR"
            access="anonymous"
        />

<reference-descriptor
   name="homeAddress"
   class-ref="Address"
   auto-retrieve="true"
   auto-update="true"
   auto-delete="true">
   <foreignkey field-ref="fkLoginHome" />
   <foreignkey field-ref="fkTypeHome" />
</reference-descriptor>

In Address you use the composite PK and both attributes has to be set by hand (no PK auto-generation was used) and the 'login' field is a FK from User table. This will make things complicated, because on insert OJB will first store the 1:1 references, but in your case we need the 'login' PK first. So we need a workaround when insert User objects:

broker.beginTransaction();
User user = new User();
broker.store(user);
// now the PK ('login' field in User) is specified
Address home = new Address();
home.setLogin(user.getLogin());
home.setType("home");
user.setHome(home);
//
broker.store(user);
broker.commitTransaction();

Things will be easier when you use an single autoincremented PK field in Address. In this case all will be handled by OJB and you only need single FK field-descriptor in User:

broker.beginTransaction();
User user = new User();
Address home = new Address();
home.setType("home");
user.setHome(home);
broker.store(user);
broker.commitTransaction();

regards,
Armin


Günther Wieser wrote:
hi,

as far as i understand this, you try to differentiate by the value of
"adress.type" whether an adress is a home wor work adress?
well, i have no solution for that, but i tried it here with a similair data
structur, and it didn't work either.
to be honest i'm not sure if this is the intended use for <attribute> in
<collection-descriptor> or <reference-descriptor>, because i didn't find
anything in the docs. all i found was an example in the ojb test cases in
repository_junit.xml, but the corresponding source code didn't tell me
anything i could understand.

so, long speach, short meaning: i'm also interested in a solution for that!

kr,
guenther


-----Original Message-----
From: Georg Müller [mailto:[EMAIL PROTECTED] Sent: Wednesday, March 02, 2005 9:24 PM
To: ojb-user@db.apache.org
Subject: Mapping question


Hi,

I have an object "User" who has 2 addresses, home and work.

User is mapped to a table user (no problem here).

Both home and work address are mapped to a table address.
This table has a composite primary key: login and type
  - login from table user as a foreign key
  - type is a string (or enum) "home" and "work"

I have tried the following without success:

in User description:

<reference-descriptor
   name="homeAddress"
   class-ref="Address"
   auto-update="true"
   auto-delete="true">
   <attribute attribute-name="type" attribute-value="heimat"/>
   <foreignkey field-ref="login" />
</reference-descriptor>


and in Address description:

<field-descriptor
   name="login"
   column="login"
   primarykey="true" />

<field-descriptor
   name="type"
   column="type"
   primarykey="true" />


Is it possible to make it run anyhow?

Regards,
Georg

P.S.: Please CC me

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




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




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



Reply via email to