【问题标题】:How to alter databases tables at run time using JPA?如何使用 JPA 在运行时更改数据库表?
【发布时间】:2023-11-09 05:56:01
【问题描述】:

我正在为客户创建 CRUD 应用程序。他让我允许他在表单(数据库列)中创建新字段,而无需重新启动应用程序服务器。我应该使用哪个 JPA 实现(hibernate、eclipselink、openjpa) 完成这项任务以及如何完成?

【问题讨论】:

  • 这真的不是你想做的事。
  • JPA 用于持久性,并且一次性生成模式以匹配该持久性,而不是用于与模式有关。
  • eclipselink(AFAIAK hibernate 也是)有“动态列”的概念,恕我直言,如果没有客户和架构师的决定,很难在您的上下文中使用。主题不容易

标签: java hibernate jpa eclipselink openjpa


【解决方案1】:

请不要在运行时更改数据库架构。

假设,您将向表中添加一列。然后你也必须在你的实体类中添加一个字段。和映射。因此,您不仅需要在运行时更改 Java 类,而且在下一次应用程序启动时,您必须再次添加此字段。没有 JPA 实现可以做到这一点。

当然,您可以使用纯 JDBC。而不是具有具体字段的实体类,您可以为您的动态字段使用地图之类的东西。但是您应该根据动态字段的存在来调整所有 SQL 查询。因此,您需要一种方法来存储已经创建的动态字段的信息。您可以使用另一个表或使用表元信息来执行此操作。此外,您必须管理用户定义的字段名称。例如,您应该避免使用 SQL 关键字,存在最大字段名称长度等。

或者您可以退后一步,重新考虑您的方法。您有一个要求:表单中的静态给定字段以及创建动态字段的可能性。

为什么不让您的数据模型适应该要求?一种能够处理动态表单字段的数据模型。这种灵活的数据模型不需要动态 SQL 表字段创建。 (JPA 也可以处理。)

最简单的示例是包含两列的表格。一个用于字段名称,一个用于值(作为字符串)。也许第三个来识别类型。

另一种选择是使用 NoSQL 数据库系统,例如键值存储或面向文档的数据库。

【讨论】: