Java 使用基于XML的建模在应用程序中管理数据库模式的策略

Java 使用基于XML的建模在应用程序中管理数据库模式的策略,java,mysql,xml,hibernate,Java,Mysql,Xml,Hibernate,我正在开发的应用程序目前使用一个MySQL数据库。我们计划更改应用程序的体系结构,以XML格式处理数据。因此,应用程序的对象模型将由XML模式驱动。现在我们可以使用JAXB等工具进行XML解析,并在内存中创建对象结构。 然而,我看到的主要问题是:- 如何将对象结构映射到关系数据库。我们可以在这里使用Hibernate 另一个问题是XML模式将定期更改,我们需要支持模式的早期版本 我不确定处理第2项的最佳方法是什么,因为随着模式版本数量的增加,数据库模式可能很容易开始因许多表而变得臃肿 因此,我的

我正在开发的应用程序目前使用一个MySQL数据库。我们计划更改应用程序的体系结构,以XML格式处理数据。因此,应用程序的对象模型将由XML模式驱动。现在我们可以使用JAXB等工具进行XML解析,并在内存中创建对象结构。 然而,我看到的主要问题是:-

  • 如何将对象结构映射到关系数据库。我们可以在这里使用Hibernate
  • 另一个问题是XML模式将定期更改,我们需要支持模式的早期版本
  • 我不确定处理第2项的最佳方法是什么,因为随着模式版本数量的增加,数据库模式可能很容易开始因许多表而变得臃肿

    因此,我的主要问题是,从对象建模角度和数据库模式角度来看,管理此类版本更改的最佳策略是什么

    继续丰富您的模式,但确保它与以前的模式向后兼容,以便JAXB能够解析最古老和最新的基于模式的XML并将其映射到您的对象中。这将意味着对数据库模式进行更改,使其具有与要映射的旧实体兼容的模式;此外,JAXB工作的所有版本的模式名称空间等都应该相同。我想你会有很多可为空的列等。这是未来的风险,但它可以工作,如果做得好

    哦,现在我看到您编辑了您的评论,并向我提供了更多信息,因此:

    由于模式不断变化,我建议跳过JAXB。JAXB并不是为这种不断变化而设计的。Smooks(在Eclipse中安装JBoss工具插件)是。它将允许您为每个不同版本的基于模式的XML到Hibernate实体类定义不同的映射定义。因此,通过这种方式,您将维护Smooks映射、Hibernate实体类和数据库模式。关于数据库模式,有一些方法可以使它在不改变结构的情况下不断发展,但您必须牺牲引用完整性……我不会


    我想有很多解决方案可以解决您的问题

    XML模式不断发展的本质意味着使用JAXB是不可伸缩的,因为这意味着每次模式更改时都会静态地生成一批新的类。系统必须支持架构的所有早期版本


    我决定用它来解析XML模式。这意味着可以在运行时动态选择和处理正确的模式版本。因此,我们可以构建一种解析模式和实例化适当类的通用方法。

    是的。体系结构的变化是渐进的,因此我们需要支持现有流程。您是否认为我们应该使用XML或基于对象的数据库?可能-或者类似于支持db模式定义中的继承的Postgres。如果对模式的更改相对较小,并且本质上主要是添加的,那么它可能会提供一些帮助。我必须说,我完全没有以这种方式使用Postgres的经验。你没有具体说明实体上会发生的各种变化。更改是关系更改还是新属性(列)?还有,XML来自哪里?您是否从web服务读取它,以便对于不同版本的模式,您将拥有不同的web服务?我这样问是因为JAXB需要一个关于它将用于将XML映射到的类的参考点。我们可以有结构(关系)更改,也可以有实体属性的更改。XML以HTTP消息的形式进入系统。我们将有一个消息解码器组件,它解析XML消息并根据模式进行验证。需要支持多个版本的消息抱歉,我的措辞有点误导。XML模式将有许多版本。所以问题实际上是如何处理模式的多个版本,以及对数据库的影响。感谢您提供到Smooks的链接,以前没有使用过。因为您将有一个组件根据其架构验证XML,这意味着您将能够区分要使用的Smooks映射定义,以便将特定架构的XML映射到Hibernate对象。数据库必须在结构上更新,尽管这样才能使所有模式都满意,这意味着Hibernate类也将在结构上受到影响。这当然意味着停机。这使得避免JAXB变得更加清晰,因为每个模式都将有一组新的类,这意味着要为VM加载更多的类定义。