【问题标题】:JAXB, custom marshalling of relationshipsJAXB,关系的自定义编组
【发布时间】:2017-02-06 04:11:50
【问题描述】:

我有一个 API,它允许第三方通过代表我的 java 域的 XML 文件与我的数据库进行交互。

我使用 JAXB 来定义我的 POJO 和 XML 之间的 xsd 以及 marshal/un-marshal。

我面临的问题是如何支持相当于休眠的延迟加载。即仅在特定条件下递归地编组对象。我想到的条件类似于 RequestFactory 使用的 .with(...) ,用户可以在其中准确指定要返回的对象图的哪一部分。

考虑“Person”在另一个表中有“Image”的情况。当使用 API 并请求一个“人”时,我希望能够指定 .with(Image) 或等效的东西,否则每个用例都会受到惩罚,必须携带这个图像
(a) 不是必需的
(b) 有不必要的数据库命中。
我有 100 多个表,排列过于复杂,无法编写专门的 POJO。

如何使用 JAXB 或任何其他免费库来满足上述要求。

【问题讨论】:

  • 为什么不使用继承。您可以创建 Person 对象,并且 PersonWithmage 扩展了 Person。虽然 Parent 没有要求,但 child 可能需要额外的字段。
  • 如果只有 10 个左右的情况,我会这样做,但是满足任何可能的第三方要求的排列数量之多是无法管理的。
  • 您可以通过一些反射来实现,实现一个 with() 方法(每个可序列化到 xml 对象使用的接口),该方法通过反射解析对象以匹配传递给 with() 的参数/映射最后通过映射返回给定对象的成员
  • 如果我理解正确这意味着我将手动处理编组并且几乎取消 JAXB?我已经开始设计手动解决方案,但希望避免这种情况。
  • 这听起来很有希望,尽管我怀疑它涉及每个案例的自定义编码......我会调查的。谢谢。

标签: java xml hibernate jaxb


【解决方案1】:

一种可能的简单解决方案(假设您使用带有 JAXB 注释的 JPA 实体,但也适用于简单的 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;
    }
}

【讨论】:

  • 他不想为所有要序列化的对象创建一个实体,在cmets中指出。
  • 所以如果你不喜欢 JPA 注释,你可以把它们拿走 :)
  • 但是这样你就需要为你想要序列化的所有实例手动创建一个类和一个方法。
  • 已经有 POJO - 所以用 1 种额外的方法来丰富它们就足够了。
  • 我喜欢这个主意。我必须小心,因为这个链接在对象图中更深,但我没有预见到问题。明天会尝试并更新帖子。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多