Andrew, Werner, et al-
Not knowing a lot about these CGLib proxies, my first question is what
do they return when calling obj.getClass()? I'm guessing since
they're proxies, you can't do a classA == classB comparison, but you
might be able to get away with a string comparison on the name or
something... I agree with Werner that there should be a fix, we just
need to find it :)
Stephen
On 2/14/06, Erik Eide <[EMAIL PROTECTED]> wrote:
> For what its worth, I'm using Castor to map XML requests onto
> Hibernate entities.
>
> Based on similar issues (but also wanting to map one XML element onto
> several object properties), I ended up writing a set of mapping files,
> along with having setIgnoreExtraElements to true when I generate XML
> response from the Hibernate entities.
>
> If you're using Hibernate 3, they've started implementing their own
> XML marshalling/unmarshalling stuff, which I think is based on dom4j.
> I'm not sure how far they've got with it, when I looked at it was
> still early on - with more features slated for the 3.1 release.
>
> Erik
>
> On 2/14/06, Andrew Mason <[EMAIL PROTECTED]> wrote:
> > 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.
> >
> > 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?
> > 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.
> > 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]
> -------------------------------------------------
>
>