2015-09-16 124 views
1

我有兩個類,如下所示,帶有JAXB註釋。我一直在尋找應對週期的方法,但我仍然不明白。在這個例子中,@XmlID和@XmlIDREF如何在這兩個類中相互工作?爲什麼在這兩個類中都有@XmlDREF?有人可以幫助解釋這是如何工作的?提前謝謝了。JAXB,帶有@XmlID註釋的XML mashal

類別之一:

@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

首先是什麼方法public Lecturer(String name){在客戶類中沒有返回類型。你是否生成了代碼? – robin

+0

@robin謝謝。我非常抱歉我輸入@根據幻燈片編輯出來。這是一個錯字。我編輯它。它應該是客戶 – user3735871

+1

加上在Custmer中應該有一個addOrder方法吧? – robin

回答

1

從你的例子,我認爲它是一個許多客戶和他們取得的訂單之間的多對多關係。

@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更改爲命令類中的名稱,然後重新運行該程序,它將提供如下所示的輸出。

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

謝謝。答案中的第二個@XmlID應該是@XmlIDREF?那麼用@XmlIDREF註釋的字段不會包含在XML中?例如在訂單類'@XmlElement(name =「Customer」) @XmlIDREF private List _customers;',所以客戶的列表不打印在XML中?那麼'@XmlElement(name =「Customer」)''有什麼用,因爲我們已經有了作爲客戶的根元素? – user3735871

+1

感謝您的更正,使答案發生了變化。我從客戶的角度來測試這個例子,所以它就像我們有一個客戶有id,名字和順序(這是另一個對象)。由於我們有2個XmlElement,它們都將作爲子元素來使用。現在第二個元素是另一個對象,這個對象在ID上具有XMLID,這就是ID顯示的原因。 XMLIDREF就像是客戶訂購的參考。 – robin