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]
-------------------------------------------------