Werner-

So I was thinking about this last night after I shut the computer
down...  Since Andrew has a "bidirecitonal" 1:m relation (i.e. a
parent can have many children, a child can have many parents... did I
just make this m:m?) is it better to set up a table with two foreign
keys (to continue the example, parent id and child id) to model that
relation?  From the little reading I've done in relational data
modeling that seems like the most straight forward way to encapsulate
the data in the database, but it may not be most conducive to JDO.  If
the foreign key table is the best way, I just need to look up the SQL
command to create that (have I mentioned I've only done a little of
this stuff?), and I need to figure out the correct mapping.

Thanks for the help and allowing me to think out loud.

Stephen


On 2/14/06, Werner Guttmann <[EMAIL PROTECTED]> wrote:
> Stephen,
>
> we'd be more than happy to provide you with some help when it comes down
> to your personal learning experience. What do you need ?
>
> To, for example, model a 1:M relation from A to B, in A you'll need a
> property named 'bs' of type e.g. List, and in the mapping file a field
> mapping similar to
>
> <field name="bs" type="some.domain.B" collection="arraylist">
>         <sql many-key=" ..." />
> </field>
>
> And in terms of the SQL statements to create A and B, one could use the
> following statements as a starting point:
>
> create table domain_a (
>   id int not null PRIMARY KEY,
>   name varchar(20)
> );
>
> create table domain_B 8
>   id int not null PRIMARY KEY,
>   descr varchar(20),
>   a_id int
> );
>
> I hope this keeps you going ... ;-).
>
> Werner
>
> Stephen Bash wrote:
> > Well gentlemen, since I've wanted to learn more about the JDO world
> > for a while now, I took this as a chance to read up more on Castor
> > JDO.  And honestly, most of it makes sense though I have very little
> > experience with O/R mapping.  Unfortunately, when it comes to actually
> > creating the database schema or correctly modeling the 1:m relations,
> > I'm out of my league, so I'm probably going to have to leave this one
> > for someone else.
> >
> > Thanks,
> > Stephen
> >
> > On 2/13/06, Ralf Joachim <[EMAIL PROTECTED]> wrote:
> >> Hi Andrew, Hi Stephen,
> >>
> >> according to my knowledge hibernate returns cglib-proxies instead of the
> >> original ones as they havily us lazy loading of data from database. In
> >> the past a few users had problems with the constelation castor xml
> >> together with hibernate according to this cglib-proxies.
> >>
> >> Just in case you are not aware of it
> >> Ralf
> >>
> >>
> >> Stephen Bash schrieb:
> >>> Andrew-
> >>>
> >>> So I tried to recreate your problem with a simpler set of classes:
> >>>
> >>>    public class ParentFoo {
> >>>       protected int parentId;
> >>>       protected Set children;
> >>>
> >>>       public int getParentId() { return parentId; }
> >>>       public void setParentId( int parentId ) { this.parentId = parentId; 
> >>> }
> >>>
> >>>       public Set getChildren() { return children; }
> >>>       public void setChildren( Set children ) { this.children = children; 
> >>> }
> >>>    }
> >>>
> >>>    public class ChildFoo {
> >>>       protected int childId;
> >>>       protected Set parents;
> >>>
> >>>       public int getChildId() { return childId; }
> >>>       public void setChildId( int childId ) { this.childId = childId; }
> >>>
> >>>       public Set getParents() { return parents; }
> >>>       public void setParents( Set parents ) { this.parents = parents; }
> >>>
> >>>       public String toString() { return( String.valueOf( childId ) ); }
> >>>    }
> >>>
> >>> And the following mapping file:
> >>>
> >>>    <mapping>
> >>>       <class name="ParentFoo">
> >>>          <map-to xml="parent-foo" />
> >>>
> >>>          <field name="parentId" type="integer">
> >>>             <bind-xml name="id" node="attribute" />
> >>>          </field>
> >>>
> >>>           <field name="children" collection="set" type="ChildFoo">
> >>>              <bind-xml name="child" />
> >>>           </field>
> >>>       </class>
> >>>
> >>>       <class name="ChildFoo">
> >>>          <map-to xml="child-foo" />
> >>>
> >>>          <field name="childId" type="integer">
> >>>             <bind-xml name="id" node="attribute" />
> >>>          </field>
> >>>
> >>> <!--
> >>>          <field name="parents" collection="set"
> >>> type="castor.mason.one.ParentFoo">
> >>>             <bind-xml name="parent" />
> >>>          </field>
> >>>  -->
> >>>       </class>
> >>>    </mapping>
> >>>
> >>> I've attempted to recreate the 1:m m:1 relationship you had.  You can
> >>> see in my mapping file I have the connection between the children and
> >>> the parents commented out.  I then created a series of parents and
> >>> children, mixing and matching them.  Using this mapping file as is to
> >>> marshal my first parent object I get:
> >>>
> >>>    <parent-foo id="1">
> >>>        <child id="5"/>
> >>>        <child id="4"/>
> >>>    </parent-foo>
> >>>
> >>> If I uncomment the child->parent relationship, I get:
> >>>
> >>>    <parent-foo id="1">
> >>>        <child id="5">
> >>>            <parent id="2">
> >>>                <child id="6">
> >>>                    <parent id="3"/>
> >>>                </child>
> >>>                <child id="4"/>
> >>>            </parent>
> >>>        </child>
> >>>        <child id="4">
> >>>            <parent id="2">
> >>>                <child id="6">
> >>>                    <parent id="3"/>
> >>>                </child>
> >>>                <child id="5"/>
> >>>            </parent>
> >>>        </child>
> >>>    </parent-foo>
> >>>
> >>> I'm somewhat surprised to find that I'm not getting the deep recursion
> >>> you mention.  I tested this with Castor 0.9.9 and 1.0M2.  What version
> >>> of Castor are you running?  If you can run this example on your system
> >>> and agree or disagree with the output, that would also be helpful.
> >>>
> >>> Do you see anything grossly different between your setup and mine?  I
> >>> don't have the intermediate classes, so that might change things, but
> >>> I wanted to start simple.
> >>>
> >>> Let me know your thoughts on this example and its comparison to your
> >>> code.  I can't directly answer your question because from what I can
> >>> tell, you're doing what I'm doing...
> >>>
> >>> Stephen
> >>>
> >>>
> >>> On 2/13/06, Andrew Mason <[EMAIL PROTECTED]> wrote:
> >>>
> >>>> OK,
> >>>>
> >>>> Here is the castor mapping file:
> >>>>
> >>>> <?xml version="1.0" encoding="UTF-8"?>
> >>>> <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Object Mapping DTD Version
> >>>> 1.0//EN"
> >>>>                                 "http://castor.org/mapping.dtd";>
> >>>> <mapping>
> >>>> <class name="uk.gov.forestry.harpps.model.Species" auto-complete="false">
> >>>> <map-to xml="species"/>
> >>>> <field name="scientificName">
> >>>> <bind-xml name="scientific-name" node="attribute"/>
> >>>> </field>
> >>>> <field name="protections"  collection="set"
> >>>> type="uk.gov.forestry.harpps.model.Protection">
> >>>> </field>
> >>>> </class>
> >>>>
> >>>> <class name="uk.gov.forestry.harpps.model.Protection"
> >>>> auto-complete="false">
> >>>> <map-to xml="protection"/>
> >>>> <field name="lookupProtection"
> >>>> type="uk.gov.forestry.harpps.model.LookupProtection">
> >>>> <bind-xml name="lookup-protection" node="element"/>
> >>>> </field>
> >>>> </class>
> >>>>
> >>>> <class name="uk.gov.forestry.harpps.model.LookupProtection"
> >>>> auto-complete="false">
> >>>> <map-to xml="protection-lookup"/>
> >>>> <field name="protectionName">
> >>>> <bind-xml name="protection-name" node="attribute"/>
> >>>> </field>
> >>>> <field name="lookupProtectionType"
> >>>> type="uk.gov.forestry.harpps.model.LookupProtectionType">
> >>>> <bind-xml name="protection-type" node="element"/>
> >>>> </field>
> >>>> </class>
> >>>>
> >>>> <class name="uk.gov.forestry.harpps.model.LookupProtectionType"
> >>>> auto-complete="false">
> >>>> <map-to xml="protection-type"/>
> >>>> <field name="protectionTypeId">
> >>>> <bind-xml name="protection-type-id" node="attribute"/>
> >>>> </field>
> >>>> </class>
> >>>> </mapping>
> >>>>
> >>>> A Species has a Hashset of Protection objects. It also has many other
> >>>> Objects associated with it in a similar way, but I'm not interested in
> >>>> generating the XML for those (yet).
> >>>>
> >>>> A Protection has a LookupProtection object, and a protectionName String.
> >>>>
> >>>> A LookupProtection object has a LookupProtectionType object.
> >>>>
> >>>> A LookupProtectionType has a protectionTypeId (long)
> >>>>
> >>>> Below is the java code of the LookupProtectionType class, you will see
> >>>> it has a relationship back to the LookupProtection object, but I don't
> >>>> want to show this within the XML. Most of the Objects also have similar
> >>>> 2 way relationships.
> >>>>
> >>>> public class LookupProtectionType  implements java.io.Serializable {
> >>>>
> >>>>
> >>>>    // Fields
> >>>>
> >>>>     private long protectionTypeId;
> >>>>     private String protectionType;
> >>>>     private Set lookupProtections = new HashSet(0);
> >>>>
> >>>>
> >>>>    // Constructors
> >>>>
> >>>>    /** default constructor */
> >>>>    public LookupProtectionType() {
> >>>>    }
> >>>>
> >>>>    /** minimal constructor */
> >>>>    public LookupProtectionType(long protectionTypeId) {
> >>>>        this.protectionTypeId = protectionTypeId;
> >>>>    }
> >>>>
> >>>>    /** full constructor */
> >>>>    public LookupProtectionType(long protectionTypeId, String
> >>>> protectionType, Set lookupProtections) {
> >>>>        this.protectionTypeId = protectionTypeId;
> >>>>        this.protectionType = protectionType;
> >>>>        this.lookupProtections = lookupProtections;
> >>>>    }
> >>>>
> >>>>
> >>>>
> >>>>    // Property accessors
> >>>>
> >>>>    public long getProtectionTypeId() {
> >>>>        return this.protectionTypeId;
> >>>>    }
> >>>>
> >>>>    public void setProtectionTypeId(long protectionTypeId) {
> >>>>        this.protectionTypeId = protectionTypeId;
> >>>>    }
> >>>>
> >>>>    public String getProtectionType() {
> >>>>        return this.protectionType;
> >>>>    }
> >>>>
> >>>>    public void setProtectionType(String protectionType) {
> >>>>        this.protectionType = protectionType;
> >>>>    }
> >>>>
> >>>>    public Set getLookupProtections() {
> >>>>        return this.lookupProtections;
> >>>>    }
> >>>>
> >>>>    public void setLookupProtections(Set lookupProtections) {
> >>>>        this.lookupProtections = lookupProtections;
> >>>>    }
> >>>>
> >>>>
> >>>> }
> >>>>
> >>>>
> >>>> Within the Hibernate mapping I made all the relationships Lazy, so they
> >>>> should only load when their get method is called.
> >>>>
> >>>> When I test the marshalling, I can see all the Non-mapped objects being
> >>>> queried from the database.
> >>>> I have tried mapping all the fields and setting them as Trasient, but
> >>>> that seemed to have no effect.
> >>>>
> >>>>
> >>>>
> >>>>
> >>>> Werner Guttmann wrote:
> >>>>
> >>>>
> >>>>> Andrew,
> >>>>>
> >>>>> Can you please show us the relevant mapping file section you are using
> >>>>> to 'disable' some of the relations ?
> >>>>>
> >>>>> Thanks
> >>>>> Werner
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Andrew Mason [mailto:[EMAIL PROTECTED]
> >>>>>> Sent: Montag, 13. Februar 2006 11:56
> >>>>>> To: [email protected]
> >>>>>> Subject: [castor-user] Castor marshalling Hibernate Pojos
> >>>>>>
> >>>>>> Hello,
> >>>>>> I apologise if this topic has been covered before - if so a
> >>>>>> pointer to the relevent posts will be appreciated.
> >>>>>>
> >>>>>> I am using Hibernate as my object persistence layer (sorry
> >>>>>> but I can't use Castor JDO due to political reasons).
> >>>>>>
> >>>>>> I wish to use Castor XML to marshall the pojos into xml documents.
> >>>>>> Many of the objects have relationships with objects that are
> >>>>>> required from a database perspective, but are not required
> >>>>>> within the XML.
> >>>>>> For example
> >>>>>>
> >>>>>> Species has a one-to-many relationship with Predator.
> >>>>>> Predator has a one-to-many relationship with Species.
> >>>>>>
> >>>>>> When I marshal a Species object I want to include it's
> >>>>>> predators, however, I do not want to include all the Species
> >>>>>> the predator preys upon within the Species XML document.
> >>>>>>
> >>>>>> I assumed that by writing a mapping document for Predator,
> >>>>>> that did not include rerlationship with Species, Castor would
> >>>>>> not bother calling the getPreySpecies method.
> >>>>>> What I am finding is that despite the mapping not including
> >>>>>> this relationship, the method is still being called, causing
> >>>>>> more species to be instantiated, thus causing more predators
> >>>>>> to be instantiated and so on until my machine runs out of memory!
> >>>>>>
> >>>>>> Is there any way of ensuring that the Marshaller pays strict
> >>>>>> attention to the Map, and doesn't call methods that are not defined?
> >>>>>>
> >>>>>>
> >>>>>> Thanks
> >>>>>>
> >>>>>> --
> >>>>>> *************************************************
> >>>>>> Andrew Mason
> >>>>>> Environ-IT Ltd.
> >>>>>> Tel.: 01899 880200
> >>>>>> Mob.: 07919 967494
> >>>>>> E-mail: [EMAIL PROTECTED]
> >>>>>> *************************************************
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> -------------------------------------------------
> >>>>>> If you wish to unsubscribe from this list, please
> >>>>>> send an empty message to the following address:
> >>>>>>
> >>>>>> [EMAIL PROTECTED]
> >>>>>> -------------------------------------------------
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>> -------------------------------------------------
> >>>>> If you wish to unsubscribe from this list, please
> >>>>> send an empty message to the following address:
> >>>>>
> >>>>> [EMAIL PROTECTED]
> >>>>> -------------------------------------------------
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>> --
> >>>> *************************************************
> >>>> Andrew Mason
> >>>> Environ-IT Ltd.
> >>>> Tel.: 01899 880200
> >>>> Mob.: 07919 967494
> >>>> E-mail: [EMAIL PROTECTED]
> >>>> *************************************************
> >>>>
> >>>>
> >>>>
> >>>> -------------------------------------------------
> >>>> If you wish to unsubscribe from this list, please
> >>>> send an empty message to the following address:
> >>>>
> >>>> [EMAIL PROTECTED]
> >>>> -------------------------------------------------
> >>>>
> >>>>
> >>>
> >> -------------------------------------------------
> >> If you wish to unsubscribe from this list, please
> >> send an empty message to the following address:
> >>
> >> [EMAIL PROTECTED]
> >> -------------------------------------------------
> >>
> >>
>
>
> -------------------------------------------------
> If you wish to unsubscribe from this list, please
> send an empty message to the following address:
>
> [EMAIL PROTECTED]
> -------------------------------------------------
>
>

Reply via email to