Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/DesignDocs/293925/MOXyExtensions/XmlCollectionReferenceMapping"

(New page: <div style="border: 1px solid rgb(0, 0, 0); margin: 5px; padding: 5px; float: right;">__TOC__</div> = XMLCollectionReferenceMapping = == Requirements == Provide support for XML collectio...)
 
(Design)
 
(6 intermediate revisions by the same user not shown)
Line 16: Line 16:
 
We will extend our current <code>xml-element</code> and <code>xml-attribute</code> support to allow collection reference mapping configuration.  For example, the following XML metadata snippet would be used to setup a collection reference mapping for 'workAddresses':  
 
We will extend our current <code>xml-element</code> and <code>xml-attribute</code> support to allow collection reference mapping configuration.  For example, the following XML metadata snippet would be used to setup a collection reference mapping for 'workAddresses':  
 
<source lang="xml">
 
<source lang="xml">
<xml-element java-attribute="workAddresses" xml-path="contact-info/work-address-id/text()" xml-idref="true" />
+
<xml-element java-attribute="workAddresses" xml-idref="true" />
 
</source>
 
</source>
 
Where the following exists in Address:
 
Where the following exists in Address:
Line 29: Line 29:
 
<source lang="xml">
 
<source lang="xml">
 
<xml-attribute java-attribute="id" xml-id="true" required="true" />
 
<xml-attribute java-attribute="id" xml-id="true" required="true" />
 +
</source>
 +
=== Read Only ===
 +
The following demonstrates how a collection reference mapping can be set as <code>read-only</code>:
 +
<source lang="xml">
 +
<xml-element java-attribute="workAddresses" xml-idref="true" read-only="true">
 +
</source>
 +
 +
=== Write Only ===
 +
The following demonstrates how a collection reference mapping can be set as <code>write-only</code>:
 +
<source lang="xml">
 +
<xml-element java-attribute="workAddresses" xml-idref="true" write-only="true">
 +
</source>
 +
 +
=== Equivalent annotations ===
 +
<source lang="java">
 +
Employee:
 +
@javax.xml.bind.annotation.XmlIDREF
 +
public List<Address> workAddresses;
 +
 +
Address:
 +
@javax.xml.bind.annotation.XmlID
 +
public String id;
 
</source>
 
</source>
  
Line 50: Line 72:
 
public class Employee {
 
public class Employee {
 
     public List<Address> workAddresses;
 
     public List<Address> workAddresses;
 +
 +
    public List<Address> getWorkAddresses() {
 +
        return workAddresses;
 +
    }
 +
 +
    public void setWorkAddresses(List<Address> workAddresses) {
 +
        this.workAddresses = workAddresses;
 +
    }
 +
 
}
 
}
 
</source>
 
</source>
Line 64: Line 95:
 
=== Deployment XML  ===
 
=== Deployment XML  ===
 
<source lang="xml">
 
<source lang="xml">
 +
<class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
 +
  <class>org.example.Employee</class>
 +
  <alias>Employee</alias>
 +
  <attribute-mappings>
 +
    <attribute-mapping xsi:type="xml-collection-reference-mapping">
 +
      <attribute-name>workAddresses</attribute-name>
 +
      <get-method>getWorkAddresses</get-method>
 +
      <set-method>setWorkAddresses</set-method>
 +
      <reference-class>org.example.Address</reference-class>
 +
      <source-to-target-key-field-association>
 +
        <field-reference>
 +
          <source-field name="contact-info/work-address-id/text()" xsi:type="node"/>
 +
          <target-field name="@aid" xsi:type="node"/>
 +
        </field-reference>
 +
      </source-to-target-key-field-association>
 +
      <source-to-target-key-fields>
 +
        <field name="contact-info/work-address-id/text()" xsi:type="node"/>
 +
      </source-to-target-key-fields>
 +
      <containerpolicy xsi:type="list-container-policy">
 +
        <collection-type>java.util.Vector</collection-type>
 +
      </containerpolicy>
 +
      <uses-single-node>false</uses-single-node>
 +
    </attribute-mapping>
 +
  </attribute-mappings>
 +
  <descriptor-type>aggregate</descriptor-type>
 +
  <default-root-element>employee</default-root-element>
 +
  <default-root-element-field name="employee"/>
 +
</class-mapping-descriptor>
 +
 
 +
<class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
 +
  <class>org.example.Address</class>
 +
  <alias>Address</alias>
 +
  <primary-key>
 +
    <field name="@aid" xsi:type="node"/>
 +
  </primary-key>
 +
  <attribute-mappings>
 +
    <attribute-mapping xsi:type="xml-direct-mapping">
 +
      <attribute-name>id</attribute-name>
 +
      <field name="@aid" xsi:type="node"/>
 +
    </attribute-mapping>
 +
  </attribute-mappings>
 +
  <default-root-element>address</default-root-element>
 +
  <default-root-element-field name="address"/>
 +
</class-mapping-descriptor>
 
</source>
 
</source>
  
Line 72: Line 147:
 
     <employee>
 
     <employee>
 
         <contact-info>
 
         <contact-info>
             <work-address-id>100</work-address-id>
+
             <work-address-id>a100</work-address-id>
             <work-address-id>101</work-address-id>
+
             <work-address-id>a101</work-address-id>
 
         </contact-info>
 
         </contact-info>
 
     </employee>
 
     </employee>
 
     <addresses>
 
     <addresses>
         <address aid="100" />
+
         <address aid="a100" />
         <address aid="101" />
+
         <address aid="a101" />
         <address aid="102" />
+
         <address aid="a102" />
 
     </addresses>
 
     </addresses>
 
</document-root>
 
</document-root>
 
</source>
 
</source>
+
 
 
=== org/example/eclipselink-oxm.xml ===
 
=== org/example/eclipselink-oxm.xml ===
 
This XML file demonstrates configuring XML collection reference mappings on the "org.example.Employee" class.  
 
This XML file demonstrates configuring XML collection reference mappings on the "org.example.Employee" class.  
Line 90: Line 165:
 
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
 
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
 
     <java-types>
 
     <java-types>
         <java-type name="org.eclipse.persistence.testing.jaxb.externalizedmetadata.mappings.collectionreference.Root">
+
         <java-type name="org.example.Root">
 
             <xml-root-element name="document-root" />
 
             <xml-root-element name="document-root" />
 
             <java-attributes>
 
             <java-attributes>
Line 97: Line 172:
 
             </java-attributes>
 
             </java-attributes>
 
         </java-type>
 
         </java-type>
         <java-type name="org.eclipse.persistence.testing.jaxb.externalizedmetadata.mappings.collectionreference.Employee">
+
         <java-type name="org.example.Employee">
 
             <java-attributes>
 
             <java-attributes>
                 <xml-element java-attribute="workAddresses" xml-path="contact-info/work-address-id/text()" xml-idref="true" />
+
                 <xml-element java-attribute="workAddresses" xml-path="contact-info/work-address-id/text()" xml-idref="true">
 +
                    <xml-access-methods get-method="getWorkAddresses" set-method="setWorkAddresses" />
 +
                </xml-element>
 
             </java-attributes>
 
             </java-attributes>
 
         </java-type>
 
         </java-type>
         <java-type name="org.eclipse.persistence.testing.jaxb.externalizedmetadata.mappings.collectionreference.Address">
+
         <java-type name="org.example.Address">
 
             <java-attributes>
 
             <java-attributes>
 
                 <xml-attribute java-attribute="id" xml-path="@aid" xml-id="true" required="true" />
 
                 <xml-attribute java-attribute="id" xml-path="@aid" xml-id="true" required="true" />

Latest revision as of 15:48, 2 June 2010

XMLCollectionReferenceMapping

Requirements

Provide support for XML collection reference mapping configuration via XML metadata file.

The following should be configurable:

Design

Basic XML collection reference mapping support

We will extend our current xml-element and xml-attribute support to allow collection reference mapping configuration. For example, the following XML metadata snippet would be used to setup a collection reference mapping for 'workAddresses':

<xml-element java-attribute="workAddresses" xml-idref="true" />

Where the following exists in Address:

<xml-attribute java-attribute="id" xml-id="true" required="true" />

If workAddresses was to be mapped to an element named work-address-id, then the following would be used:

<xml-element java-attribute="workAddresses" xml-path="work-address-id/text()" xml-idref="true" />

Where the following exists in Address:

<xml-attribute java-attribute="id" xml-id="true" required="true" />

Read Only

The following demonstrates how a collection reference mapping can be set as read-only:

<xml-element java-attribute="workAddresses" xml-idref="true" read-only="true">

Write Only

The following demonstrates how a collection reference mapping can be set as write-only:

<xml-element java-attribute="workAddresses" xml-idref="true" write-only="true">

Equivalent annotations

Employee:
@javax.xml.bind.annotation.XmlIDREF
public List<Address> workAddresses;
 
Address:
@javax.xml.bind.annotation.XmlID
public String id;

Example:

The following example will demonstrate how to configure XML collection reference mappings via XML metadata by using xml-element and xml-attribute.

org.example.Root.java

package org.example;
 
public class Root {
    public List<Employee> employees;
    public List<Address> addresses;
}

org.example.Employee.java

package org.example;
 
public class Employee {
    public List<Address> workAddresses;
 
    public List<Address> getWorkAddresses() {
        return workAddresses;
    }
 
    public void setWorkAddresses(List<Address> workAddresses) {
        this.workAddresses = workAddresses;
    }
 
}

org.example.Address.java

package org.example;
 
public class Address {
    public String id;
}

Deployment XML

<class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
  <class>org.example.Employee</class>
  <alias>Employee</alias>
  <attribute-mappings>
    <attribute-mapping xsi:type="xml-collection-reference-mapping">
      <attribute-name>workAddresses</attribute-name>
      <get-method>getWorkAddresses</get-method>
      <set-method>setWorkAddresses</set-method>
      <reference-class>org.example.Address</reference-class>
      <source-to-target-key-field-association>
        <field-reference>
          <source-field name="contact-info/work-address-id/text()" xsi:type="node"/>
          <target-field name="@aid" xsi:type="node"/>
        </field-reference>
      </source-to-target-key-field-association>
      <source-to-target-key-fields>
        <field name="contact-info/work-address-id/text()" xsi:type="node"/>
      </source-to-target-key-fields>
      <containerpolicy xsi:type="list-container-policy">
        <collection-type>java.util.Vector</collection-type>
      </containerpolicy>
      <uses-single-node>false</uses-single-node>
    </attribute-mapping>
  </attribute-mappings>
  <descriptor-type>aggregate</descriptor-type>
  <default-root-element>employee</default-root-element>
  <default-root-element-field name="employee"/>
</class-mapping-descriptor>
 
<class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
  <class>org.example.Address</class>
  <alias>Address</alias>
  <primary-key>
    <field name="@aid" xsi:type="node"/>
  </primary-key>
  <attribute-mappings>
    <attribute-mapping xsi:type="xml-direct-mapping">
      <attribute-name>id</attribute-name>
      <field name="@aid" xsi:type="node"/>
    </attribute-mapping>
  </attribute-mappings>
  <default-root-element>address</default-root-element>
  <default-root-element-field name="address"/>
</class-mapping-descriptor>

XML Instance Document

<?xml version='1.0' encoding='UTF-8'?>
<document-root>
    <employee>
        <contact-info>
            <work-address-id>a100</work-address-id>
            <work-address-id>a101</work-address-id>
        </contact-info>
    </employee>
    <addresses>
        <address aid="a100" />
        <address aid="a101" />
        <address aid="a102" />
    </addresses>
</document-root>

org/example/eclipselink-oxm.xml

This XML file demonstrates configuring XML collection reference mappings on the "org.example.Employee" class.

<?xml version="1.0" encoding="US-ASCII"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
    <java-types>
        <java-type name="org.example.Root">
            <xml-root-element name="document-root" />
            <java-attributes>
                <xml-element java-attribute="employees" xml-path="employee" />
                <xml-element java-attribute="addresses" xml-path="addresses/address" />
            </java-attributes>
        </java-type>
        <java-type name="org.example.Employee">
            <java-attributes>
                <xml-element java-attribute="workAddresses" xml-path="contact-info/work-address-id/text()" xml-idref="true">
                    <xml-access-methods get-method="getWorkAddresses" set-method="setWorkAddresses" />
                </xml-element>
            </java-attributes>
        </java-type>
        <java-type name="org.example.Address">
            <java-attributes>
                <xml-attribute java-attribute="id" xml-path="@aid" xml-id="true" required="true" />
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Open Issues

This section lists the open issues that are still pending that must be decided prior to fully implementing this project's requirements.

Issue# Owner Description/Notes

Decisions

This section lists decisions made. These are intended to document the resolution of open issues or constraints added to the project that are important.

Issue# Description/Notes Decision

Back to the top