2016-05-12 60 views
0

考虑一个商店的示例

我有一个商店的XSD以及一些包含与库存,记录等相关数据的表。我有一个DB文件与XSD相关的数据位于表中。我需要引用此文件和XSD为多个商店创建XML记录

我目前的解决方案是通过XSD使用HyperJAXB生成JPA实体并读取数据以生成XML,但我需要在每次数据库时更改代码-file和XSD有更改。通过动态更改XSD生成带DB数据的XML

是否有可能在运行时适应这些更改,同时使用JPA,因为数据库结构很复杂。如果不在运行时进行更改,我如何最大限度地减少所需的工作量。

+0

你能给出一些关于你想用这些XML文件完成的细节吗?通常,数据库是安静的web服务或应用程序的后端。它几乎看起来像您想要不断创建您当前数据库状态的xml表示形式。这些xml文件用于什么? –

+0

xml适用于我们需要提供信息的外部遗留系统,但这并不理想,但我无法为此创建Web服务。 – SKaul

+0

好的感谢您的更新 –

回答

0

好吧,根据您当前的用例,我真的认为使用像SSIS这样的专门从事ETL过程的产品可以最有效地实现这一目标。我相当肯定,甚至有一种方法可以通过让SSIS创建xml来避免翻译。但是,如果你想继续在java中进行这个过程,我建议由于表示数据库的对象而离开JPA。这意味着当数据库模式更新时,您将始终进行编码更改。我会退后一步并利用JdbcTemplate上的更多原始SQL。您可以通过利用一些SQL命令,获得一个非常通用的过程:

SHOW tables 

那么你就可以得到高的结果,为每个表

SELECT * FROM table 

这将返回一个结果集,它可以转化为XML的有一种方法像每个表...

public static Document toDocument(ResultSet rs) throws ParserConfigurationException, SQLException { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.newDocument(); 

    Element results = doc.createElement("Results"); 
    doc.appendChild(results); 

    ResultSetMetaData rsmd = rs.getMetaData(); 
    int colCount = rsmd.getColumnCount(); 

    while (rs.next()) { 
     Element row = doc.createElement("Row"); 
     results.appendChild(row); 

     for (int i = 1; i <= colCount; i++) { 
     String columnName = rsmd.getColumnName(i); 
     Object value = rs.getObject(i); 

     Element node = doc.createElement(columnName); 
     node.appendChild(doc.createTextNode(value.toString())); 
     row.appendChild(node); 
     } 
    } 
    return doc; 
} 

这应该让您打印每个表作为XML,如果你需要它是基于层次明显有涉及更多的工作,但这个禾uld使您能够创建一个可以将所有数据库表导出为xml的通用进程。

更新#1:

基于了一些谈话与我的同事,我们遵循的帮助还是管理数据库迁移的最佳实践有大量的手工操作的,但这里有一些缓解步骤我们从我们的实践中拿走。

我们对liquibase或flyway使用模式版本控制来管理跨多个环境的数据库中的模式更改。这可以保证无论环境如何,模式都是正确的。

我们还从hibernate生成模式,并使用模式比较工具(这些往往是数据库特定的)来验证hibernate模型将与数据库模型相同。这个操作通常由我们的Jenkins构建服务器完成,以确保每个构建与所需的数据库模式版本兼容。

Hibernate配置也设置为hibernate.hbm2ddl.auto = validate以确保启动时与数据库表的兼容性。

我们的本地应用程序使用Junit框架并创建了一个在derby上运行的用于数据库样式单元/集成测试的hibernate实例。这些测试确保不会破坏以前的兼容性。

当数据库在多个Java应用程序之间共享时,JPA层有时会在所有这些应用程序之间共享,并且多个组将负责该特定的代码库。这种做法有助于保持所有应用程序与数据库更改同步并利用相同的访问模式。通常还会创建一系列通用命名查询以避免应用程序团队需要创建自定义查询。

不幸的是,我们还没有遇到可以自动评估数据库模式更改并更新应用程序的银牌。目前,由于hibernate的生成过程不适合每个数据库,所以不接受从应用程序JPA更改驱动数据库更改的过程。以及休眠自动更新不是生产级功能的模式功能的许多风险。

那么,结果是相当罗嗦,但我希望我给你一些洞察你的问题。

+0

我们需要执行的数据操作受业务逻辑高度控制,我们需要在制作XML之前进行大量自定义,这也可以被第三方使用,这就是为什么我更喜欢使用JPA而不是ETL工具。 – SKaul

+0

好了,开始看到这里发生了什么。所以在xml转换之前有业务规则和潜在的转换层。好吧,让我检查一下我的同事,看看我们在这里做了什么特别的事。我的直觉是,我们只是通过CI流程和德比之上的大量单元/集成测试来降低风险。但我会回到你身边。 –

+0

这比预期的有点儿话,但我希望我们使用的一些过程可以帮助你。 –