我正在进行契约优先集成,我首先设计XSD和WSDL文件,以便客户调用托管在我们服务器上的特定Web服务。我还需要以结构化的方式将请求保存在数据库表中(首先是Oracle DB,其他的将在稍后出现)。我需要将所有字段保存为单独的列,并且多个出现的节点应该有自己的表等。
我正在考虑从XSD创建WS存根并将它们标记为JPA的实体,然后使用这些实体创建数据库表。我正在学习JPA(EclipseLink),我想知道这是否是最好的方法。
所以基本上我的问题是:当你从请求/响应XSD开始时,你将如何创建Web服务,JPA实体和数据库表?
感谢所有想法。
此致 GOKHAN
答案 0 :(得分:1)
使用Web服务生成的类作为JPA实体似乎是个好主意,但在实践中,维护将是一场噩梦。
保持JPA层和WebService层分离会好得多。
JPA层将由最佳数据库设计驱动(出于性能原因,关系,规范化/非规范化,适当字段类型的使用,主键创建策略等)。
另一方面,Web Service层是应用程序(或应用程序的一部分)的外部接口,它将提供给您或以这种方式设计,因此它是API使用中最舒适的从JPA的角度来看,它可能远非最佳。
想想如果有人告诉你WSDL即将被更改会发生什么,某些字段将从一个类移动到另一个类。如果Web服务生成的类是您的实体,则还必须更改数据库模式,迁移数据等。
反之亦然。如果您需要更改数据库架构(例如出于性能原因),则需要更改应用程序Web服务界面,我怀疑Web服务用户会对此感到高兴。
因此,即使它意味着更多工作,也要保持JPA层和Web服务层分离,这样您就可以在不改变另一部分的情况下更改一部分。
在模型视图控制器模式中,JPA层是模型的一部分,Web服务只是您的视图 - 它们不应该相互依赖。
答案 1 :(得分:1)
我在DoxDB采用了略微不同的方法,因为我选择了JSON而不是XML作为文档结构,但我认为它与您的需求相差太远(事实上当我启动它时)我首先使用的是XML。
使用LOB存储XML内容。您的JPA只有一个@Lob
注释,您可以将内容加载到其中。
使用XSD验证来自您的传输的数据,使用Marshaller
通过@WebService调用,提供CRUDL方法将该条目作为JPA实体中的吊球处理。
然后调整安全性和性能。
需要注意的是我没有将Json / XML本身映射到数据库字段和表中,而是我有一个带有“schemaname”列的表,一个LOB和一些ID(虽然目前它有一些额外的字段用于审计并仅执行逻辑删除)。我搜索了Stack Overflow,似乎大家一致认为,如果数据类似,最好只有一个大表和许多小表,另外JPA不支持动态表名。
我选择了JAX-RS(REST API)而不是JAX-WS,但这只是一个传输层,您可以根据需要选择其中一个。在该层中,我实现了一个与JPA交互的CRUDL API。您可以在JAX-RS中传递XML,如果您不想,也不需要使用WSDL。
最初的表现指标并不算太差。加载100,000行需要大约一分钟,单行检索仍然在几秒钟内完成。检索和渲染100,000行大约需要5秒钟。当然,没有科学可言,我怀疑它会在现实生活中有这样的性能,由于XA事务,分布式友好,安全性和很少的传递依赖性而带来很多负载。
我早期做出的一个架构决策是DoxDB不会对数据库进行搜索,而是将该作业传递到ElasticSearch,后者通过REST API调用而不是嵌入到应用程序中(将涉及占用他们的依赖)。这是特定于供应商的,但目前我还没有找到更好的选择。