XmlIDREF (Java Platform SE 8 )
Keywords: javax.xml.bind.annotation.XmlIDREF class
Date: 2017-01-22

javax.xml.bind.annotation

## Annotation Type XmlIDREF

-     @Retention(value=RUNTIME)
       @Target(value={FIELD,METHOD})
      public @interface XmlIDREF

  Maps a JavaBean property to XML IDREF.

  To preserve referential integrity of an object graph across XML serialization followed by a XML deserialization, requires an object reference to be marshalled by reference or containment appropriately. Annotations `@XmlID` and `@XmlIDREF` together allow a customized mapping of a JavaBean property's type by containment or reference.

  Usage

  The `@XmlIDREF` annotation can be used with the following program elements:
  - a JavaBean property
  - non static, non transient field

  See "Package Specification" in javax.xml.bind.package javadoc for additional common information.

  The usage is subject to the following constraints:

  - If the type of the field or property is a collection type, then the collection item type must contain a property or field annotated with `@XmlID`.
  - If the field or property is single valued, then the type of the property or field must contain a property or field annotated with `@XmlID`.

    Note: If the collection item type or the type of the property (for non collection type) is java.lang.Object, then the instance must contain a property/field annotated with `@XmlID` attribute.

  - This annotation can be used with the following annotations: `XmlElement`, `XmlAttribute`, `XmlList`, and `XmlElements`.

  Example: Map a JavaBean property to `xs:IDREF` (i.e. by reference rather than by containment)

         //EXAMPLE: Code fragment
         public class Shipping {
             @XmlIDREF public Customer getCustomer();
             public void setCustomer(Customer customer);
             ....
          }

         <!-- Example: XML Schema fragment -->
         <xs:complexType name="Shipping">
           <xs:complexContent>
             <xs:sequence>
               <xs:element name="customer" type="xs:IDREF"/>
               ....
             </xs:sequence>
           </xs:complexContent>
         </xs:complexType>

  Example 2: The following is a complete example of containment versus reference.

          // By default, Customer maps to complex type xs:Customer
          public class Customer {

              // map JavaBean property type to xs:ID
              @XmlID public String getCustomerID();
              public void setCustomerID(String id);

              // .... other properties not shown
          }

         // By default, Invoice maps to a complex type xs:Invoice
         public class Invoice {

             // map by reference
             @XmlIDREF public Customer getCustomer();
             public void setCustomer(Customer customer);

            // .... other properties not shown here
         }

         // By default, Shipping maps to complex type xs:Shipping
         public class Shipping {

             // map by reference
             @XmlIDREF public Customer getCustomer();
             public void setCustomer(Customer customer);
         }

         // at least one class must reference Customer by containment;
         // Customer instances won't be marshalled.
         @XmlElement(name="CustomerData")
         public class CustomerData {
             // map reference to Customer by containment by default.
             public Customer getCustomer();

             // maps reference to Shipping by containment by default.
             public Shipping getShipping();

             // maps reference to Invoice by containment by default.
             public Invoice getInvoice();
         }

         <!-- XML Schema mapping for above code frament -->

         <xs:complexType name="Invoice">
           <xs:complexContent>
             <xs:sequence>
               <xs:element name="customer" type="xs:IDREF"/>
               ....
             </xs:sequence>
           </xs:complexContent>
         </xs:complexType>

         <xs:complexType name="Shipping">
           <xs:complexContent>
             <xs:sequence>
               <xs:element name="customer" type="xs:IDREF"/>
               ....
             </xs:sequence>
           </xs:complexContent>
         </xs:complexType>

         <xs:complexType name="Customer">
           <xs:complexContent>
             <xs:sequence>
               ....
             </xs:sequence>
             <xs:attribute name="CustomerID" type="xs:ID"/>
           </xs:complexContent>
         </xs:complexType>

         <xs:complexType name="CustomerData">
           <xs:complexContent>
             <xs:sequence>
               <xs:element name="customer" type="xs:Customer"/>
               <xs:element name="shipping" type="xs:Shipping"/>
               <xs:element name="invoice"  type="xs:Invoice"/>
             </xs:sequence>
           </xs:complexContent>
         </xs:complexType>

         <xs:element name"customerData" type="xs:CustomerData"/>

         <!-- Instance document conforming to the above XML Schema -->
          <customerData>
             <customer customerID="Alice">
                 ....
             </customer>

             <shipping customer="Alice">
                 ....
             </shipping>

             <invoice customer="Alice">
                 ....
             </invoice>
         </customerData>

  Example 3: Mapping List to repeating element of type IDREF

           // Code fragment
           public class Shipping {
               @XmlIDREF
               @XmlElement(name="Alice")
                   public List customers;
           }

           <!-- XML schema fragment -->
           <xs:complexType name="Shipping">
             <xs:sequence>
               <xs:choice minOccurs="0" maxOccurs="unbounded">
                 <xs:element name="Alice" type="xs:IDREF"/>
               </xs:choice>
             </xs:sequence>
           </xs:complexType>

  Example 4: Mapping a List to a list of elements of type IDREF.

           //Code fragment
           public class Shipping {
               @XmlIDREF
               @XmlElements(
                   @XmlElement(name="Alice", type="Customer.class")
                    @XmlElement(name="John", type="InternationalCustomer.class")
               public List customers;
           }

           <!-- XML Schema fragment -->
           <xs:complexType name="Shipping">
             <xs:sequence>
               <xs:choice minOccurs="0" maxOccurs="unbounded">
                 <xs:element name="Alice" type="xs:IDREF"/>
                 <xs:element name="John" type="xs:IDREF"/>
               </xs:choice>
             </xs:sequence>
           </xs:complexType>

  Since:
    JAXB2.0
  See Also:
    `XmlID`

Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2017, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.