備註:我是EclipseLink JAXB (MOXy)的領導者和JAXB 2 (JSR-222)專家組的成員。
爲了支持您的數據的不同視圖的概念,我會建議有一個JAXBContext
的不同實例來表示每個映射:BRIEF,SUMMARY,FULL。 MOXy允許您通過利用其external mapping document將多個映射應用於域模型。
策略
- 批註映射完整的模型,並使用XML元數據,以減少 映射
- 批註映射最小模型,並使用XML元數據來 擴展映射
示例代碼
JAXBContext
的三個實例構建於同一類(UserProfile
)上,但具有由MOXy的外部映射文檔控制的不同映射。
JAXBContext briefContext = JAXBContext.newInstance(UserProfile.class);
Map<String, Object> summaryProperties = new HashMap<String, Object>(1);
summaryProperties.put("eclipselink-oxm-xml", "summaryMapping.xml");
JAXBContext summaryContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, summaryProperties);
List<String> fullMappingXMLs = new ArrayList(2);
fullMappingXMLs.add("summaryMapping.xml");
fullMappingXMLs.add("fullMapping.xml");
Map<String, Object> fullProperties = new HashMap<String, Object>(1);
fullProperties.put("eclipselink-oxm-xml", fullMappingXMLs);
JAXBContext fullContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, fullProperties);
下面是一個演示如何從多個映射文檔引導JAXBContext
的示例。
擴展模式
在莫西擴展映射元數據的能力是針對開發人員希望做而不必關閉正在運行的應用程序更改了元數據。這方面的一個例子是支持在線調查的領域模型,需要加強以支持一個新問題。
謝謝你的答案。但是我不明白如何在我現有的模型上使用映射文件。實際上最好的可能是擁有模型(經典的JPA實體),然後使用映射文件修剪模型。但是當我測試它時,映射文件並沒有被考慮在內。即使使用JAXBHelper.getJAXBContext(jc).refeshMetadata(); – njames 2012-04-10 12:23:29
@njames - 我已經用可以使用的策略更新了我的答案。我建議爲不同級別的映射使用「JAXBContext」的不同實例,而不是刷新元數據。 – 2012-04-10 13:28:35
感謝您的明確答覆!不過,我已經這樣做了。我的問題是:因爲我有一個帶有註釋類的現有JPA/JAXB模型,有沒有辦法使用映射文件來「覆蓋」現有模型?我的擔心是我無法更改爲模型(也沒有刪除註釋以僅使用映射文件) – njames 2012-04-10 13:39:24