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

-- 
View this message in context: 
http://old.nabble.com/How-to-map-cyclic---recursive-objects--tp26317185p26369227.html
Sent from the Castor - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to