JAXB,XML mashal with @XmlID 注释

JAXB, XML mashal with @XmlID annotations

我有两个 类,如下所示,带有 JAXB 注释。我查阅了有关应对周期的信息,但我仍然不明白。示例中,@XmlID 和@XmlIDREF 在这两个类 中如何相互配合?为什么 类 中都有@XmlDREF?有人可以帮忙解释一下这是如何工作的吗?提前谢谢了。

Class一个:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    private static int NEXT_ID = 0;
    @XmlID
    @XmlAttribute(name="xml-id")
    private String _xmlId;

    @XmlElement(name="name")
    private String _name;

    @XmlElementWrapper(name="orders-made")
    @XmlElement(name="orders")
    @XmlIDREF
    private List<Order> _ordersMade;

     protected Customer() { 
        this(null);
     }

   public Customer (String name) {
       _name = name;
       _ordersMade = new ArrayList<Order>();

       NEXT_ID++;
       _xmlId = getClass().getName() + ":" + NEXT_ID;
    }

    public String getName() {
       return _name;
    }
    public void addOrder(Order order) {
    _ordersMade.add(order);
    order.addCustomer(this);
}
}

Class 二:

 @XmlAccessorType(XmlAccessType.FIELD)
 public class Order {

     private static int NEXT_ID = 0;

     @XmlID
     @XmlAttribute(name="xml-id")
     private String _xmlId; 

     @XmlElement(name="Customer")
     @XmlIDREF
     private List<Customer> _customers;

     @XmlElement(name="name")
    private String _name;

     protected Order() {
        this(null);
     }

    public Order(String name) {
         _name = name;
         _customers = new ArrayList<Customer>();

          NEXT_ID++;
        _xmlId = getClass().getName() + ":" + NEXT_ID;
     }

    public String getName() {
       return _name;
    }

   void addCustomer(Customer customer) {
       _customers.add(customer);
    }
}

根据你的例子,我假设它是客户和他们下的订单之间的多对多关系。

@XmlID - 您可以将其视为元素的 ID(比如客户或在数据库中订购类似的键)。

@XmlIDREF - 您可以将其视为其他对象的参考(在客户 class 其订单的情况下,反之亦然,它就像数据库中的外键)。

最好的判断方法是尝试下面的程序

Customer c1 = new Customer("Robin");
Order o1 = new Order("Phone");
c1.addOrder(o1);
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(c1, System.out);

它会给出类似

的输出
<customer xml-id="Customer:1">
    <name>Robin</name>
    <orders-made>
        <orders>Order:1</orders>
        <orders>Order:2</orders>
    </orders-made>
</customer>

顺序显示为顺序 1 和顺序 2,因为 id 是顺序中的关键元素,现在将 @XmlID 从 id 更改为顺序 class 中的 name 并重新运行程序,它将给出输出如下所示。

<customer xml-id="Customer:1">
    <name>Robin</name>
    <orders-made>
        <orders>Phone</orders>
        <orders>Tab</orders>
    </orders-made>
</customer>