我有两个类,如下所示,使用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);
}
}
答案 0 :(得分:1)
从你的例子中我假设客户与他们所订单之间存在多对多的关系。
@XmlID - 您可以将其视为元素的ID(比如客户或在数据库中订购它的键)。
@XmlIDREF - 您可以将此视为某个其他Object的引用(如果客户类是其顺序,反之亦然,它就像数据库中的外键)。
最好的方法是尝试下面的程序
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>