2016-09-28 35 views
0

我有一個API允許第三方通過代表我的java域的XML文件與我的數據庫進行交互。我使用JAXB來定義xsd以及我的POJO和XML之間的編組/非編組。JAXB,關係的自定義編組

我面對的問題是如何支持相當於休眠延遲加載。即在一定條件下遞歸地編組對象。我想到的情況就像RequestFactory使用的是.with(...),用戶可以準確指定要返回的對象圖的哪個部分。

考慮「人」在另一個表中具有「圖像」的情況。當使用API​​並請求一個「Person」時,我希望能夠指定.with(Image)或其他類似的東西,否則每個用例都會受到懲罰,不得不攜帶這個圖像,而不需要(a)
(b )有一個不必要的數據庫命中。
我有100多個表,排列太複雜,無法編寫專門的POJO。

如何使用JAXB或任何其他免費庫滿足上述要求。

+0

爲什麼不使用繼承。您可以創建Person對象,並且PersonWithmage擴展Person。雖然Parent沒有要求,但孩子可能需要額外的字段。 –

+0

如果僅僅是10個左右的情況,我會這麼做,但是滿足任何可能的第三方需求的排列數量是不可管理的。 – user2046211

+1

您可以通過一些反射來實現,實現一個with()方法(每個可序列化到xml對象使用的接口),通過反射來解析對象,以匹配傳遞給()的參數/映射並最終返回給定對象的成員通過映射 –

回答

0

一個可能的簡單解決方案(假設你使用JPA實體JAXB註釋,但作品,以及用簡單的POJO):

  • 豐富每個實體與一些複製方法 - 即「copyForExport」
  • 這種方法建立一個實體的非託管副本而不不必要的出口
  • 元帥您的副本

示例值:

@Entity 
@XmlType 
@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class SampleEntity { 
    @Id private long id; 
    @Column private String meaningful; 
    @Column private String something1; 
    @OneToMany private List<Something> something2; 

    SampleEntity copyForExport() { 
     SampleEntity copy = new SampleEntity(); 
     copy.id = id; 
     copy.meaningful = meaningful; 
     return copy; 
    } 
} 
+0

他不想爲所有要序列化的對象創建一個實體,並在評論中指出。 –

+0

所以,如果你不喜歡它們,你可以拿走JPA註釋:) –

+0

但是這樣你就需要爲所有想要序列化的實例手動創建一個類和一個方法。 –