为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Spring Boot Data JPA 按需创建表

使用 Spring Boot Data JPA 按需创建表

慕婉清6462132 2023-09-13 10:56:44
我正在尝试创建一个 Spring Boot 应用程序,我想在其中按需创建和使用数据库表,而不为它们定义实体/存储库。我有一个基本 Business 实体和 BusinessType 实体来保留业务类型。我希望能够使用自己的表为业务类型(例如 Coffeeshop)动态创建一个表(同时我可以将表的名称保留在 BusinessType 表上并决定从那里查询哪个表)。因此,如果不定义实体和/或为 Coffeeshop 创建 CrudRepository,我可以创建一个名为 Coffeeshop 的表,然后对其进行一些查询吗?如果没有,我有什么选择?在典型的 Spring Data JPA 应用程序中,您如何处理已经获得基本类型并允许系统具有更具体的类型(与基本类型持久化和关联)的情况?谢谢
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

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


要使用 JPA 解决您的问题,一种理想的解决方案是将所有业务保留在一个表中(映射到业务实体类,如您所描述的),并在表上有一个(外来)键以允许每一行都有一种商业类型。然后,您可以通过查询选择具有特定类型的企业集(而不是通过定位不同的表)。


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);

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


查看完整回答
反对 回复 2023-09-13
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

几年前,我曾经参与过这样一个项目——我们曾经使用 Spring Boot,但没有故意使用 hibernate/jpa/spring data。

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

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

  • 使用Flyway生成架构。该工具与 Spring boot 集成,以便在应用程序启动时调用它并检查架构版本(如果它有更多“最近”脚本) - 它将更改应用于数据库 - 称为“迁移”的东西。另一个流行的替代方案是Liquidbase,两者都与 Spring Boot AFAIK 一起使用。

  • 我们使用JOOQ来避免编写普通的 JDBC 查询。如果您决定使用 JOOQ(我完全可以推荐这个工具 - 它对我们来说非常有用,简单,方便,类型安全),您可以阅读本教程以与 Spring Boot 集成。其他替代方案是MyBatis,或者如果您想要“低级”,请使用JDBI或 Spring 的 JdbcTemplate。我确信还有其他选择。

因此,基本上,通过此设置,流程如下所示:在构建时,您生成表后面的 Java 代码 (JOOQ)。这段代码与 Hibernate 实体完全不同,它只包含足够的信息来准备类似 JAVA DSL 的语言的查询,它本身不会生成查询。

当应用程序启动时 - 它会检查架构并应用迁移(flyway)。迁移是您在其中编写 SQL 的源文件。

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


查看完整回答
反对 回复 2023-09-13
  • 2 回答
  • 0 关注
  • 57 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信