0

考虑一个商店的例子,

我有一个商店的 XSD,以及一些包含与库存、记录等相关的数据的表。我有一个 DB 文件,指定与 XSD 相关的数据在表中的位置。我需要参考这个文件和 XSD 来为多个商店创建 XML 记录

我当前的解决方案是通过 XSD 使用 HyperJAXB 生成 JPA 实体并读取数据以生成 XML,但我需要在每次 DB 文件和XSD 有变化。

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

4

1 回答 1

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,如果您需要它是基于层次结构的,显然需要更多的工作,但这将使您能够创建一个可以将所有数据库表导出为 xml 的通用过程。

更新#1:

根据与我的同事的一些对话,我们遵循的帮助管理数据库迁移的最佳实践仍然需要大量的手动工作,但以下是我们从实践中采取的一些缓解措施。

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

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

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

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

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

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

好吧,事实证明这很……罗嗦,但我希望我能让你对你的问题有所了解。

于 2016-05-12T12:55:01.480 回答