|
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: REQUIRED | OPTIONAL | DETAIL: ELEMENT | ||||||||
javax.xml.bind.annotation Annotation Type XmlIDREF
@Target(value={FIELD, METHOD})
将 JavaBean 属性映射到 XML IDREF。
要在 XML 序列化然后反序列化这一过程中保持对象图形的引用完整性,需要通过使用引用或容器适当地对对象引用进行编组。注释 @XmlID 和 @XmlIDREF 一起使用时允许通过容器或引用来实现 JavaBean 属性类型的自定义映射。
用法
@XmlIDREF 注释能够与以下程序元素一起使用:- JavaBean 属性
- 非 static、非 transient 字段
有关其他公共消息,请参阅 javax.xml.bind.package javadoc 中的“包规范”。
用法受到以下约束的限制:
- 如果字段或属性的类型是一个 collection 类型,则集合项类型必须包含一个用 @XmlID 注释的属性或字段。
- 如果字段或属性的类型是 single valued,则属性或字段的类型必须包含一个用 @XmlID 注释的属性或字段。
注:如果集合项类型或属性的类型(用于非 collection 类型)是 java.lang.Object,则该实例必须包含一个用 @XmlID 属性注释的属性/字段。
- 此注释可与以下注释一起使用:
XmlElement、XmlAttribute、XmlList和XmlElements。
示例:将 JavaBean 属性映射到 xs:IDREF(即通过引用而不是通过包含)。
//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>
示例 2:以下是一个对比容器与引用的完整示例。
// 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>
示例 3:将列表映射到 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>
示例 4:将列表映射到 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 | |
| version |
| |
| See also | javax.xml.bind.annotation.XmlID |
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, andXmlElements.
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
- Version:
- $Revision: 1.12 $
- Author:
- Sekhar Vajjhala, Sun Microsystems, Inc.
- See Also:
XmlID
|
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: REQUIRED | OPTIONAL | DETAIL: ELEMENT | ||||||||
Submit a bug or feature
Copyright 2007 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.
PS : 未经我党受权你也可自由散发此文档。 如有任何错误请自行修正;若因此而造成任何损失请直接找人民主席,请勿与本人联系。谢谢!