Andrew, Please see inline for comments ...
Werner > -----Original Message----- > From: Andrew Mason [mailto:[EMAIL PROTECTED] > Sent: Dienstag, 14. Februar 2006 13:46 > To: [email protected] > Subject: [castor-user] Re: [SPAM] - [SPAM] - Re: > [castor-user] Castor marshalling Hibernate Pojos - Email > found in subject - Email found in subject - Email found in > subject - Email found in subject > > Thanks for all your suggestions guys, > I think I've figured out what is going on here, and it does > seem to be linked to the fact that Hibernate is using CGLIB > enhancements for Classes that are lazily loaded. > During the Validate phase of the Marshalling, the method > MappingLoader.getDescriptor(Class type) is called, this uses > the Hashtable _clsDescs to find the ClassDescriptor which are > keyed by the pojo's classes. > However, when the marshaller gets the class of a lazily > loaded field (with it's CGLIB enhancements), it doesn't match > the classes within MappingLoader._clsDescs, so the Marshaller > treats the classes as not mapped, and introspects them. Can you please point me to the exact location of the code described here ? I am sure a solution can be provided, though it is not going to be easy .. ;-). > I don't know if this is the only place this is a problem, or > whether I'm going to encounter similar issues deeper within > the code - can anyone tell me? No, I don't know either, as I am not that familiar with Castor XML as with the JDO side of things. But maybe somebody else can step in and answer that question. > I figure it must be possible to fix this problem, and as the > alternative is to drop Castor XML from the project I'll have a go. Well, well ... dropping something that works otherwise does not look like a viable option to me .. ;-). Let's see what we can come up with. > Unless there is some other way of geting around it? > Any ideas? > > Thanks > > Andrew > > > Werner Guttmann 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] > >------------------------------------------------- > > > > > > > > > > > > -- > ************************************************* > 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] -------------------------------------------------

