XmlIDREF (Java(TM) EE 7 Specification APIs) (original) (raw)

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:

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

The usage is subject to the following constraints:

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); .... }

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

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();     

}

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

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

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

<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:element name"customerData" type="xs:CustomerData"/>

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

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

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>