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 討論這種方法。
添加回答
舉報