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。此策略将需要更多的工作,并且此类应用程序将需要架构编辑权限。在企业环境中,通常不鼓励这样做。
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 讨论这种方法。
添加回答
举报