Java 如何使用JPA在运行时更改数据库表?

Java 如何使用JPA在运行时更改数据库表?,java,hibernate,jpa,eclipselink,openjpa,Java,Hibernate,Jpa,Eclipselink,Openjpa,我正在为客户创建CRUD应用程序。他让我允许他在表单(数据库列)中创建新字段,而无需重新启动应用程序服务器。我应该使用哪个JPA实现(hibernate、eclipselink、openjpa) 要完成此任务以及如何完成此任务?请不要在运行时更改数据库架构 假设您将向表中添加一列。然后还必须在实体类中添加一个字段。还有地图。所以,您不仅需要在运行时更改Java类,还必须在下一个应用程序启动时再次添加此字段。没有JPA实现可以做到这一点 当然,您可以使用普通JDBC。您可以使用类似于映射的东西来表

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

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

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

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

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

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

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


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

这确实不是您想要做的事情。JPA用于持久性,并一次性生成模式以匹配该持久性,而不是使用模式。eclipselink(Afaik hibernate)有“动态列”的概念,如果没有客户和架构师的决定,很难在您的上下文中使用。这不容易,西玛