Hi Robert,

Thanks for your ODMG example.
Of course this make sense for me!

But, about my problem, I say two things:
- I'm using the PersistenceBroker, not ODMG (but that's not very important)
- I wouldn't create a "Base" super-class

Mainly my question was: if I implement a qualified M:N mapping (as explained in 
tutorial 3), how could I retrieve directly data. If I take your example:
How could I retrieve all Brokers for a certain Home (how can I implement a method 
"getBrokers in the HomeBO class)?

I'm asking this because few weeks ago I implemented a non-qualified M:N mapping and 
this was so easy. You just have the two classes (HomeBO and BrokerBO, no association 
class like BrokerToHomeBO because OJB automates this) and if you want to retrieve all 
Brokers for a certain Home, just call the method getBrokers from a HomeBO object. The 
HomeBO class contains a "private BrokerBO brokers" attribute declared in 
repository.xml.

Have you any idea about that because it is not clearly explained in tutorial 3?

Thanks again
Sylvain


-----Message d'origine-----
De: Robert S. Sfeir [mailto:[EMAIL PROTECTED]]
Date: mardi, 18. f�vrier 2003 16:15
�: OJB Users List
Objet: Re: M:N mapping: PLEASE HELP


Well here is how I did it last night, I could be wrong and someone will 
fix this for me, but here is what I did anyway:
I always setup a base business object to work with plus the other 
classes.  Everything extends BaseBO.

BaseBO

BaseBO has get/set methods which create the following business objects
HomeBO
BrokerBO
BrokerToHomeBO

each of those business objects have their own set/get methods for the 
various values you'll want to bind.  These values are mapped in the 
repository.xml to column names.

Also in BaseBO I have get/set methods which create Collections of the 
following:

Collection homeBOColl
Collection brokerBOColl
Collection brokerToHomesBOColl

Now, say I want to get everything about a home and return it to which 
ever client requested it, I setup a Data Transfer Object, in this case 
we'll call it HomeDetailDTO.  Home detail DTO has the set/get methods 
to set/get any of the business objects you need to bring data back to 
your client.  in otherwords you have things like:

public HomeBO getHomeBO()
{
  return homeBO;
}


public Collection getHomeBOColl()
{
  return homeBOColl;
}

etc...

The reason I have this data transfer object is because it makes it a 
lot easier to grab all the data once and move one object around pre 
populated with everything I need in it (including the Collections which 
will result from the select)

Now to select everything about a Home, I do the following:

        public HomeDetailDTO selectHomeDetail( Integer homeID ) throws 
DataAccessException
        {
                List results = null;
                HomeBO home = null;
                HomeDetailDTO homeDet = null;
                Transaction tx = null;
                try
                {
                        tx = odmg.newTransaction();
                        tx.begin();
                        OQLQuery query = odmg.newOQLQuery();
                        //This select will cascade down to the other relationships you 
have 
setup because of auto-retrieve="true"
                        String sql = "select homeDetail from " + 
HomeBO.class.getName();
                        sql += " where homeID = $1";
                        query.create( sql );
                        query.bind( homeID );
                        results = ( List ) query.execute();
                        tx.commit();
                        //Bind the results to the HomeBO object
                        home = ( HomeBO ) results.get( 0 );
                        //Initialize the home detail dto
                        homeDet = new HomeDetailDTO();
                        //Now set the values for the BrokerHomesColl Collection.  This 
is 
where the meat of this example is see below
                        homeDet.setBrokerHomesColl( home.getBrokerHomesColl() );
                        ... do other sets here to bind all the data to the 
HomeDetailDTO ...
                }
                ... do catch etc
        }

Now since you've bound all the values to one object and returned the 
object, you can pull the values out of that object.  In my case the 
brokerHomesColl actually contains a collection of BrokerBO objects with 
full info on the brokers which are related to the home.  This is 
because I have a 1:n relationship from the brokers table to the 
brokers_to_homes table.  If you run in a debugger (I use IntelliJ IDEA 
to write my code) you can step through in the debugger and look at the 
contents of the brokerHomesColl and see that there are 1 or more 
BrokerBO objects in it.  To get the data out and prove that, you do 
this:

                HomeDetailDTO hdto = homeImpl.selectHomeDetail( homeID ); <-- this is 
the method call to the method described above
                Iterator it = hdto.getBrokerHomesColl().iterator();
                while( it.hasNext() )
                {
                        BrokersToHomesBO bth = ( BrokersToHomesBO ) it.next();
                        BrokerBO bro = bth.getBrokerBO();
                        System.out.println( "The Bro Name is: " + bro.getName() ); // 
You 
will see the value of bro.getName() for that specific home
                }

If there are no objects to iterate through, then that means there are 
no BrokerBO objects in the relationship.

So in my case I grab all the values out of BrokerBO for each object in 
the HomeDetailDTO, add it to a List object and now I have what I need 
to work with in my 'upper layers' where I do my presentation.

Does this make ANY sense at all?  If not I'm surprised because this 
exact same stuff is in Tutorial 3, and it makes very little sense there 
until you carefully study the UML design, compare them to the XML 
mapping, AND look at the ODMG tutorials to see how to select, AND look 
at the Advanced O/R under 1:n to notice that they say to make sure 
auto-retreive is true if you're going to use ODMG.

The problem is not the documentation on the site, the problem is WHERE 
the documentation is on the site and how it's organized, but I can 
understand why it's all over the place since writing the code is more 
important than keeping clean docs and concrete world examples.  I found 
most of my clues as to where to look on the site by doing lots of 
various searches in the archives, none of which had a full answer to 
the problem.

For those writing the docs, it would be MUCH MORE useful to have an 
ODMG example right there with the UML design and the xml repository 
equivalent.


R

--
Robert S. Sfeir
Senior Java Engineer
National Institutes of Health
Center for Information Technology
Department of Enterprise Custom Applications
[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