【问题标题】:Using Web Service Client JAXB Generated Classes as JPA Entities使用 Web 服务客户端 JAXB 生成的类作为 JPA 实体
【发布时间】:2014-04-23 23:43:36
【问题描述】:

我正在开发一个项目,以从 SOAP Web 服务中检索数据并将其存储在数据库中以供以后使用 JPA 使用。目前,我使用 Spring WS 作为客户端,并使用 JAXB 生成 Web 服务类。

我们的目标是在数据库中忠实地复制这些类(相当大)中包含的所有数据,为此,将 JPA 注释应用于 JAXB 生成的类具有一定的吸引力。从长远来看,这似乎很危险,因为生成的类似乎相当短暂,如果 wsdl 发生变化,我会在重新生成代码时做很多工作来重新应用 jpa 注释。

另一个选项是让我的 web 服务客户端将数据复制到我创建的 JPA 实体中,可能使用工厂模式。这将 JPA 持久性与 WSDL 设计者可能不断变化的突发奇想分离,并且在某种程度上感觉更安全。它也感觉更安全,因为实体类永远不会被构建任务覆盖。

这种情况的最佳做法是什么?显然,过度解耦在意味着大量数据传输对象时不会得到回报,但这种情况是否特殊? JAXB 创建的类是否应该只在 web 服务客户端中使用,并很快被更高级别的应用程序遗忘?

【问题讨论】:

  • 听起来您正在从 web 服务中检索大量数据,这意味着其他系统已保留所有信息。您是否需要将其变成一个完整的数据库,或者您可以每次都使用网络服务来获取实体?
  • @isakgilbert 这是一种按查询付费的事情......

标签: java spring web-services jpa jaxb


【解决方案1】:

原则上不要更改 JAXB 生成的对象。正如您非常正确地指出的那样,这些都会随着 WSDL 的每一次细微更改而改变。

最被接受的过程是解耦 JAXB 对象和 JPA 实体。相同的有两个主要优点

  1. 如果您觉得 JAXB 太慢或太占用内存,可以稍后更改数据绑定提供程序
  2. 您没有将您的 JPA 代码绑定到您的 DB 代码。因此,如果明天您的 WSDL 发生变化或数据库结构发生变化,这些都不会受到影响。

要在两者之间传输数据,您可以使用工厂模式或使用 bean 映射框架,如

  1. Dozer
  2. Orika
  3. Other options

【讨论】:

  • 我最终没有更改 JAXB 对象,感谢您将我从长期的支持噩梦中拯救出来 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2013-07-27
  • 2013-01-02
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多