我正在开发一个项目,从 SOAP Web 服务检索数据并将其存储在数据库中以供以后使用 JPA 使用。目前,我使用 Spring WS 作为客户端,并使用 JAXB 生成 Web 服务类。
目标是将这些类(相当大)中包含的所有数据忠实地复制到数据库中,为此,将 JPA 注释应用于 JAXB 生成的类是很有吸引力的。从长远来看,这似乎很危险,因为生成的类看起来相当短暂,并且如果 wsdl 发生更改,我将在重新应用 jpa 注释的同时重新生成代码做大量工作。
另一个选项是让我的 Web 服务客户端将数据复制到我创建的 JPA 实体中,可能使用工厂模式。这将 JPA 持久性与 WSDL 设计者可能变化的突发奇想分开,并且在某种程度上感觉更安全。它还感觉更安全,因为实体类永远不会被构建任务覆盖。
这种情况的最佳做法是什么?显然,当需要大量数据传输对象时,过度解耦并不会带来好处,但这种情况有什么特殊之处吗? JAXB 创建的类是否应该仅在 Web 服务客户端中使用,并很快被更高级别的应用程序遗忘?
最佳答案
原则上不要更改 JAXB 生成的对象。正如您非常正确地指出的那样,这些都会随着 WSDL 的每一次微小更改而改变。
最受接受的过程是将 JAXB 对象和 JPA 实体解耦。相同的有两个主要优点
- 如果您觉得 JAXB 太慢或内存占用太大,您可以稍后更改数据绑定(bind)提供程序
- 您没有将 JPA 代码与 DB 代码绑定(bind)。因此,如果明天您的 WSDL 发生变化或您的数据库结构发生变化,这些都不会受到影响。
要在两者之间传输数据,您可以使用工厂模式或使用 bean 映射框架,例如
关于java - 使用 Web 服务客户端 JAXB 生成的类作为 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257203/