Stephen,

I am not 100% sure, but the problem Andrew is facing might be related to
the fact that he 's using Hibernate for persistence. As far as I
remember, Hibernate is using CGLIB to implement lazy loading. If that's
the case, for any entity loaded as part of a 1:M relation that is
declared as 'lazy', Hibernate will return a dynamic proxy (if interfaces
are being used). In other words, see whether you can re-create Andrew's
problem by adding Castor JDO to the mix and define a 1:M relation of
your choice to be lazy loaded.

Regards
Werner

Stephen Bash wrote:
> 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]
-------------------------------------------------

Reply via email to