2016-09-28 60 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

但是这样你就需要为所有想要序列化的实例手动创建一个类和一个方法。 –