我有两个类,如下所示,带有 JAXB 注释。我查过有关应对周期的信息,但我仍然不明白。在示例中,@XmlID 和@XmlIDREF 在这两个类中如何相互协作?为什么两个类中都有@XmlDREF?有人可以帮忙解释一下这是如何工作的吗?提前谢谢了。
第一类:
@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);
}
}
第二类:
@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 - 您可以将其视为某些其他对象的引用(在客户类的情况下其顺序,反之亦然,它就像数据库中的外键)。
最好的判断方法是尝试下面的程序
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 更改为 name 并重新运行程序,它将给出如下输出。
<customer xml-id="Customer:1">
<name>Robin</name>
<orders-made>
<orders>Phone</orders>
<orders>Tab</orders>
</orders-made>
</customer>
关于java - JAXB、带有 @XmlID 注释的 XML mashal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603410/