亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號