XML与对象树

时间:2011-02-04 20:30:12

标签: java xml xml-serialization

在我目前的项目(从头开始构建订单管理系统)中,我们以XML对象的形式处理订单,这些订单保存在关系数据库中。

我会概述这样的要求:

  • 从订单中的任何位置选择各种详细信息
  • 更新/丰富数据(例如来自CRM系统)
  • 记录更改(使旧数据无效,插入新值)
  • SQL查询(第二级支持)
  • 可以轻松选择订单的详细信息

我们做了什么:

  • 序列化使用专有代码完成,将订单拆分为customeraddressphone_numberorder_position等表格。
  • 每当订单处理得更远时(例如由于传入的事件),它就会从数据库中完全读取并汇编回XML文档。
  • 数据的选择由XPath完成(分散在代码上)。
  • 大多数更新都是直接在数据库中完成的(然后将重新加载订单以进行下一步)。

我们面临的问题:

  • 订单结构(XSD)随着每次发布而发展。因此,XPath和自定义持久性经常会中断并产生错误。
  • 我们最终混合使用文档和数据库(因为持久层不能保留文档中的更改)。

性能不是真正的问题(因为它是一个离线系统,订单经常被故意延迟几天。

我不希望在这里获得免费咨询,但我对如何改进这种方法感到有些困惑(下次,基本上)。

您认为处理这些要求的好方法是什么? 使用对象图,像JXPath和OGNL以及OR映射器是一种更好的方法吗?或使用例如XML支持Oracle数据库?

2 个答案:

答案 0 :(得分:1)

标准Java EE方法是将您的数据表示为POJO,并使用JPA进行数据库访问,使用JAXB将对象转换为XML或从XML转换。

<强> JPA

  • 对象到关系标准
  • 所有应用服务器供应商都支持。
  • 多个可用的实现EclipseLink,Hibernate等
  • 强大的查询语言JPQL(与SQL非常相似)
  • 为您处理查询优化。

<强> JAXB

  • 对象到XML标准
  • 所有应用服务器供应商都支持。
  • 可用的多种实现:EclipseLink MOXy,Metro,Apache JaxMe等

示例

答案 1 :(得分:1)

如果您的架构经常更改,我建议不要使用任何类型的对象映射。你不断改变样板代码只是为了它。

而是使用声明性架构定义来验证数据更改和访问。 将订单视为单个数据,表示为XML文档。 使用面向文档的存储(如MongoDB,Cassandra或许多XML数据库之一)直接操作文档。不要费心将它切成片以将其存储在关系数据库中。

通过关系数据库中的报告工具访问数据可能被视为次要数据。例如,MongoDB上的简单map-reduce作业可以在需要时将所需的订单详细信息填充到关系数据库中,从而很自然地将两个用例分开。