使用 Spring Boot Data JPA 按需创建表

Creating tables on demand with Spring Boot Data JPA

我正在尝试创建一个 Spring 启动应用程序,我想在其中按需创建和使用数据库 table,而不为它们定义实体/存储库。

我有一个基本的 Business 实体和 BusinessType 实体来保留业务类型。我希望能够使用自己的 table 为业务类型(比如 Coffeeshop)动态创建 table(同时我可以在 BusinessType [=24] 上保留 table 的名称=] 并决定从那里查询哪个 table)。

因此,在不定义实体 and/or 为 Coffeeshop 创建 CrudRepository 的情况下,我可以创建一个名为 Coffeeshop 的 table 并稍后对其进行一些查询吗?

如果不行,我有什么选择?在典型的 Spring Data JPA 应用程序中,您如何处理具有基类型并允许系统具有更多具体类型(持久化并与基类型相关联)的情况?

谢谢

您描述的持久性策略不适合 JPA。 JPA 是一种 ORM(对象关系映射)策略,其中框架将数据从基于 class 的对象映射到模式定义的关系 table 中的行。如果 table 没有相应的 class,或者 class 没有特定的 table,这会使注解驱动的实现变得复杂。

要使用 JPA 解决您的问题,惯用的解决方案是将您的所有业务集中在一个 table(映射到一个业务实体 class,如您所述),并拥有一个table 上的(外)键允许每一行都有一个业务类型。然后,您可以通过查询 select 具有特定类型的一组企业(而不是通过定位不同的 table。)

Business
id | type       | name           | etc...
1    COFFEESHOP   Alices Coffee

BusinessType
id          | name | industry
COFFEESHOP    Cafe   HOSPITAILITY

然后要获取系统中的所有咖啡店,您需要定义一个 BusinessRepository 方法

@Query(value = "{ 'type': ?0  }")
List<Business> findAllByType(String type);

要使用您描述的 table 创建策略解决您的问题,您必须自己编写大部分数据访问层。您可以在手写的 BusinessDAO class(不使用 JPA 或注释)中执行此操作,它将具有使用普通 JDBC 构造和执行 SQL 语句的方法,以实现所需的模式操作。如果您想要一个库来模拟 JPA 为您提供的 SQL 方言独立性,您可以查看 JOOQ。此策略将需要做更多的工作,并且此类应用程序将需要架构编辑权限。在通常不鼓励的企业环境中。

几年前,我曾经从事过这样的项目 - 我们曾经使用 spring 启动回来,但没有故意使用 hibernate/jpa/spring 数据。

恕我直言 JPA 的整个想法是提供实体(假设您是 java 程序员,不一定了解 SQL / Db Schema)并让hibernate/jpa 发挥它的魔力并为您定义架构(给定属性)。也可以采用“其他方式”,让您的表已经存在并尝试创建实体,以便它们“映射”到 RDBMS 中的现有结构。

您所描述的内容根本不适合这种方法。 所以在我们的项目中,由于我们不想处理由 hibernate 引入的查询的复杂性,并且希望有选择地使用您描述的动态结构,我们已经完成了以下操作:

  • 已使用 Flyway to generate the schemas. This tool is integrated with Spring boot so that it gets called when the application starts and checks the schema version, if it has more "recent" scripts - it applies the changes to the DB - something that is called "migrations". Another popular alternative is liquidbase,两者均适用于 spring 引导 AFAIK。
  • 我们使用了 JOOQ to avoid writing a plain JDBC queries. If you decide to work with JOOQ (I can totally recommend this tool - it worked great for us, simple, convenient, type-safe), you can read this tutorial to integrate with spring boot. Other alternatives are MyBatis or if you want to go "low-level", use JDBI 或 Spring 的 JdbcTemplate。我相信还有其他选择。

所以基本上这个设置的流程是这样的: 在构建时,您生成位于表格后面的 Java 代码 (JOOQ)。这段代码与 Hibernate 实体完全不同,它包含的信息刚好足以用 JAVA DSL 类语言准备查询,它本身不会生成查询。

应用程序启动时 - 它会检查模式并应用迁移 (flyway)。迁移是您在其中编写 SQL.

的源文件

现在一个可能的警告是您需要 RDBMS 级别的权限才能实际创建这样的表。因此,根据您的组织,这可能不是微不足道的,所以我建议先与您的 DBA 讨论这种方法。