Hi, have you had a look at
http://www.castor.org/how-to-use-references-in-xml.html as suggested by Ralf ? You'll find all informations related to this task in this HOW-TO. Regards Werner jimmi4664 wrote: > Any ideas on this? How could I marshal / unmarshal the example parent-child > relation with castor? > > > > > jimmi4664 wrote: >> Are you suggesting that I should define the mapping differently instead of >> using mapping.xml file? >> >> For now I preferred experimenting further with the original mapping.xml >> path and thought about the possibility of using one field as the "unique >> identifier". I think I could use it even though I don't have a pure >> "unique identifier" for my class. I can get the example from >> http://www.castor.org/how-to-use-references-in-xml.html working. It still >> works quite weird when I try this example that follows my actual needs in >> concept: >> >> public class Child { >> private String name; >> private Parent parent; >> private int age; >> // getters and setters >> } >> >> public class Parent { >> private int id; >> private Child child; >> // getters and setters >> } >> >> mapping.xml: >> >> <class name="tests.Parent" identity="id"> >> <map-to xml="parent"/> >> <field name="id" type="int"> >> <bind-xml name="id" node="element" /> >> </field> >> <field name="child" type="tests.Child"> >> <bind-xml name="child" node="element"/> >> </field> >> </class> >> >> <class name="tests.Child"> >> <map-to xml="child"/> >> <field name="name" type="java.lang.String"> >> <bind-xml name="name" node="element" /> >> </field> >> <field name="age" type="int" > >> <bind-xml name="age" node="element" /> >> </field> >> <field name="parent" type="tests.Parent"> >> <bind-xml name="parent" node="element" reference="true"/> >> </field> >> </class> >> >> marshalling: >> >> Parent p = new Parent(); >> Child c = new Child(); >> p.setChild(c); >> p.setId(111); >> c.setName("Jack"); >> c.setAge(10); >> c.setParent(p); >> .... >> marshaller.marshal(p); >> >> => >> >> <?xml version="1.0" encoding="UTF-8"?> >> <parent> >> <id>111</id> >> <child> >> <name>Jack</name> >> <age>10</age> >> </child> >> </parent> >> >> So the child's reference to parent is missing, and Child.parent is null >> when unmarshalled. >> >> >> >> >> >> Werner Guttmann-6 wrote: >>> Hi, >>> >>> jimmi4664 wrote: >>>> There's no requirements on the XML, other than I want to persist my >>>> objects >>>> as an XML file, and be able to reconstruct them later. The resulting XML >>>> can >>>> (pretty much) be whatever castor would like it to be. >>>> >>>> So, -for example- following XML would be fine: >>>> >>>> <person> >>>> <name>asdfas</name> >>>> <castor-generated-id>4652</castor-generated-id> >>>> <cars> >>>> <car> >>>> <license-plate>34243</license-plate> >>>> <owner-castor-generated-id>4652</owner-castor-generated-id > >>>> </car> >>>> <car> >>>> <license-plate>111221</license-plate> >>>> < owner-castor-generated-id >4652</owner-castor-generated-id > >>>> </car> >>>> </cars> >>>> </person> >>>> >>>> The fact is that I don't have "id" field in my objects. They are pure >>>> POJOs >>>> and just have object references to one another. Castor _could_ >>>> theoretically >>>> cope with this requirement by just using object identity and generating >>>> correct "id" fields internally. >>> Yes and no. If you were to use XML schemas to define your contracts, >>> you'd be using <xsd:ID/> and <xsd:IDREF/> types to denote that you are >>> dealing with (cyclic) references. Have a look at e.g. the XML Schema >>> Primer [1] first, and we'll continue our conversation after you have >>> familiarized yourself with the concepts presented therein. >>> >>> Okay ? >>> >>> Regards >>> Werner >>> >>> [1] http://www.w3.org/TR/xmlschema-0/ >>> >>>> I don't know if this is available, or do I need to create artificial ID >>>> fields in my POJOs? >>>> >>>> Another alternative is to forget about Car.owner in the mapping and just >>>> fix >>>> it manually after unmarshalling the objects. >>>> >>>> >>>> Werner Guttmann-6 wrote: >>>>> Hi, >>>>> >>>>> how does/should your XML actually look like ? >>>>> >>>>> Regards >>>>> Werner >>>>> >>>>> jimmi4664 wrote: >>>>>> That seems to assume I would have a unique identifier in my object. >>>>>> There's >>>>>> actually no good field in my example that could be used like that, and >>>>>> what's worse my real world case does not have that either. >>>>>> >>>>>> So I believe if I want to make castor set the references correctly, I >>>>>> need >>>>>> to add some artificial ID field to my classes? >>>>>> >>>>>> >>>>>> >>>>>> Ralf Joachim-2 wrote: >>>>>>> Hi Janne, >>>>>>> >>>>>>> when using mapping usage of references as explained in: >>>>>>> >>>>>>> http://www.castor.org/how-to-use-references-in-xml.html >>>>>>> >>>>>>> may help. If you generate code out of XSD you may need to take a look >>>>>>> at >>>>>>> xs:id and xs:idref to handle this. >>>>>>> >>>>>>> Having said that I never used that myself. >>>>>>> >>>>>>> Regards >>>>>>> Ralf >>>>>>> >>>>>>> jimmi4664 schrieb: >>>>>>>> I tried autocreating mapping file for a simple example using >>>>>>>> MappingTool >>>>>>>> to >>>>>>>> maybe give a hint on how to do this: >>>>>>>> >>>>>>>> public class Owner { >>>>>>>> private String name; >>>>>>>> private ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>(); >>>>>>>> >>>>>>>> public String getName() { >>>>>>>> return name; >>>>>>>> } >>>>>>>> >>>>>>>> public void setName(String name) { >>>>>>>> this.name = name; >>>>>>>> } >>>>>>>> >>>>>>>> public ArrayList<Vehicle> getVehicles() { >>>>>>>> return vehicles; >>>>>>>> } >>>>>>>> >>>>>>>> public void setVehicles(ArrayList<Vehicle> vehicles) { >>>>>>>> this.vehicles = vehicles; >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> public class Vehicle { >>>>>>>> private String name; >>>>>>>> private Owner owner; >>>>>>>> >>>>>>>> public String getName() { >>>>>>>> return name; >>>>>>>> } >>>>>>>> >>>>>>>> public void setName(String name) { >>>>>>>> this.name = name; >>>>>>>> } >>>>>>>> >>>>>>>> public Owner getOwner() { >>>>>>>> return owner; >>>>>>>> } >>>>>>>> >>>>>>>> public void setOwner(Owner owner) { >>>>>>>> this.owner = owner; >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> MappingTool tool = new MappingTool(); >>>>>>>> tool.setInternalContext(new >>>>>>>> BackwardCompatibilityContext()); >>>>>>>> boolean deep = true; >>>>>>>> File targetFile = new File("generated-mapping.xml"); >>>>>>>> log.debug("generating mapping file..."); >>>>>>>> tool.addClass(Owner.class, deep); >>>>>>>> fw = new FileWriter(targetFile); >>>>>>>> tool.write(fw); >>>>>>>> log.debug("...done generating mapping file: " + >>>>>>>> targetFile); >>>>>>>> >>>>>>>> But the end result is: >>>>>>>> >>>>>>>> <?xml version="1.0" encoding="UTF-8"?> >>>>>>>> <mapping xmlns="http://castor.exolab.org/" >>>>>>>> xmlns:cst="http://castor.exolab.org/"> >>>>>>>> <description xmlns="">Castor generated mapping >>>>>>>> file</description> >>>>>>>> <class name="tests.Owner"> >>>>>>>> <description xmlns="">Default mapping for class >>>>>>>> tests.Owner</description> >>>>>>>> <map-to/> >>>>>>>> <field name="name" type="java.lang.String"> >>>>>>>> <bind-xml name="name" node="element"/> >>>>>>>> </field> >>>>>>>> <field name="vehicles" type="java.lang.Object" >>>>>>>> collection="arraylist"> >>>>>>>> <bind-xml name="vehicles" node="element"/> >>>>>>>> </field> >>>>>>>> </class> >>>>>>>> </mapping> >>>>>>>> >>>>>>>> So it seems it maps Vehicles in the list as Objects, which does not >>>>>>>> help >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> -- >>>>>>> >>>>>>> Syscon Ingenieurbüro für Meß- und Datentechnik GmbH >>>>>>> Ralf Joachim >>>>>>> Raiffeisenstraße 11 >>>>>>> 72127 Kusterdingen >>>>>>> Germany >>>>>>> >>>>>>> Tel. +49 7071 3690 52 >>>>>>> Mobil: +49 173 9630135 >>>>>>> Fax +49 7071 3690 98 >>>>>>> >>>>>>> Internet: www.syscon.eu >>>>>>> E-Mail: [email protected] >>>>>>> >>>>>>> Sitz der Gesellschaft: D-72127 Kusterdingen >>>>>>> Registereintrag: Amtsgericht Stuttgart, HRB 382295 >>>>>>> Geschäftsleitung: Jens Joachim, Ralf Joachim >>>>>>> >>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe from this list, please visit: >>>>>>> >>>>>>> http://xircles.codehaus.org/manage_email >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe from this list, please visit: >>>>> >>>>> http://xircles.codehaus.org/manage_email >>>>> >>>>> >>>>> >>>>> >>> --------------------------------------------------------------------- >>> To unsubscribe from this list, please visit: >>> >>> http://xircles.codehaus.org/manage_email >>> >>> >>> >>> >> > --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email

