javascript
jpa 不自动建表_如何来实现SpringBoot应用的JPA数据持久化和热插拔
數據持久化
JPA ( Java Persistence API)是用于管理Java EE和Java SE環境中的持久化,以及對象/關系映射的Java API。
JPA最新規范為“JSR 338: Java Persistence 2.1”( htps:/cp.org/e/e/ail?id=338)。目前,市面上實現該規范的常見JPA框架有EclipseLink ( ht://www.eclipse.org/ecipselink)、Hibermate( ht:t:hib/mate.or/orom )、Apache OpenJPA ( htp://penipapache.org/)等。
本文主要介紹以Hibernate為實現的JPA。
JPA的產生背景
在JPA產生之前,圍繞如何簡化數據庫操作的相關討論已經是層出不窮,眾多廠商和開源社區也都提供了持久層框架的實現,其中ORM框架最為開發人員所關注。
ORM ( Object Relational Mapping,對象關系映射)是-一種用于實現面向對象編程語言里不同類型系統的數據之間轉換的程序技術。由于面向對象數據庫系統( OODBS)的實現在技術上還存在難點,目前,市面上流行的數據庫還是以關系型數據庫為主。
由于關系型數據庫使用的SQL語言是一-種非過程化的面向集合的語言,而目前許多應用仍然是由高級程序設計語言( 如Java)來實現的,但是高級程序設計語言是過程化的,而且是面向單個數據的,這使得SQL與它之間存在著不匹配,這種不匹配稱為“阻抗失配”。由于“阻抗失配”的存在,使得開發人員在使用關系型數據庫時不得不花很多功夫去完成兩種語言之間的相互轉化。
而ORM框架的產生,正是為了簡化這種轉化操作。在編程語言中,使用ORM就可以使用面向對象的方式來完成數據庫的操作。
ORM框架的出現,使直接存儲對象成為可能,它們將對象拆分成SQL語句,從而來操作數據庫。但是不同的ORM框架,在使用上存在比較大的差異,這也導致開發人員需要學習各種不同的ORM框架,增加了技術學習的成本。
而JAP規范就是為了解決這個問題:規范ORM框架,使用ORM框架統- -的接口 和用法。這樣在采用面向接口編程的技術中,即便更換了不同的ORM框架,也無須變更業務邏輯。
最早的JPA規范是由Java官方提出的,隨JavaEE5規范一同發布。
實體( Entity )
實體是輕量級的持久化域對象。通常,實體表示關系數據庫中的表,并且每個實體實例對應于該表中的行。實體的主要編程工件是實體類,盡管實體可以使用輔助類。
在EJB3之前,EJB 主要包含三種類型:會話bean、消息驅動bean、實體bean。但自EJB 3.0開始,實體bean被單獨分離出來,形成了新的規范: JPA。所以,JPA完全可以脫離EJB 3來使用。實體是JPA中的核心概念。
實體的持久狀態通過持久化字段或持久化屬性來表示。這些字段或屬性使用對象/關系映射注解將實體和實體關系映射到基礎數據存儲中的關系數據。
與實體在概念上比較接近的另外一個領域對象是值對象。實體是可以被跟蹤的,通常會有一個主鍵(唯一標識)來追蹤其狀態。而值對象則沒有這種標識,我們只關心值對象的屬性。
Spring Data JPA概述
Spring Data JPA是更大的Spring Data家族的一部分,使得輕松實現基于JPA的存儲庫變得更容易。該模塊用于處理對基于JPA的數據訪問層的增強支持。它使更容易構建基于使用Spring數據訪問技術棧的應用程序。
Spring Data JPA對于JPA的支持則是更近-步。使用Spring Data JPA,開發者無須過多關注EntityManager的創建、事務處理等JPA相關的處理,這基本上也是作為一個 開發框架而言所能做到的極限了,甚至Spring Data JPA讓你連實現持久層業務邏輯的工作都省了,唯-要做的,就只是聲明持久層的接口,其他都交給Spring Data JPA來幫你完成。
Spring Data JPA就是這么強大,讓你的數據持久層開發工作簡化,只需聲明一個接口。比如,你聲明了一個findUserBylId0,Spring Data JPA就能判斷出這是根據給定條件的ID查詢出滿足條件的User對象,而其中的實現過程開發者無須關心,這一-切都交予Spring Data JPA來完成。
對于普通開發者而言,自己實現應用程序的數據訪問層是一件極 其繁瑣的過程。開發者必須編寫太多的樣板代碼來執行簡單查詢、分頁和審計。Spring Data JPA旨在通過將努力減少到實際需要的量來顯著改進數據訪問層的實現。作為開發人員,只需要編寫存儲庫的接口,包括自定義查詢方法,而這些接口的實現,Spring Data JPA將會自動提供。
Spring Data JPA包含如下特征。
●基于Spring和JPA來構建復雜的存儲庫。
支持Querydsl ( htp://ww.querydsl.com)謂詞,因此支持類型安全的JPA查詢。
域類的透明審計。
具備分頁支持、動態查詢執行、集成自定義數據訪問代碼的能力。
在引導時驗證帶@Query注解的查詢。
●支持基于XML的實體映射。
通過引入@EnableJpaRepositories來實現基于JavaConfig的存儲庫配置。
如何使用Spring Data JPA
在項目中使用spring- data-jpa的推薦方法是使用依賴關系管理系統。下 面是使用Gradle構建的示例。
dependencies {compile ' org. spr ingf ramework. data:spring-data-jpa:2.0.0.M4 '
}
在代碼中,我們只需聲明繼承自Spring Data JPA中的接口。
import org. springfr amework. data. jpa. repository .JpaRepository;public interface UserRepository extends JpaRepository<User, Long>{
ListfindByNameLike (String name) ;
在這個例子中,代碼繼承自Spring Data JPA中的JpaRepository接口,而后聲明相關的方法即可。比如聲明findByNameLike,就能自動實現通過名稱來模糊查詢的方法。
Spring Data JPA的核心概念
SpringData存儲庫抽象中的中央接口是Repository。它將域類及域類的ID類型作為類型參數進行管理。此接口主要作為標記接口捕獲要使用的類型,并幫助發現擴展此接口。而CrudReposi-tory為受管理的實體類提供復雜的CRUD功能。
public interface CrudRepository<T, ID extends Serializable>extends Repository<T, ID> {
S save(S entity); // (1)T findOne (ID primaryKey) ;? // (2)Iterable findAll () ;? // (3)Long count() ; // (4)void delete(T entity) ; // (5)boolean exists(ID primaryKey); // (6)//省略更多方法...
CrudRepository接口中的方法含義如下。
(1)保存給定實體。
(2)返回由給定ID標識的實體。
(3)返回所有實體。
(4)返回實體的數量。
(5)刪除給定的實體。
(6)指示是否存在具有給定ID的實體。
同時還提供其他特定的持久化技術的抽象,比如JpaRepository或MongoRepository,這些接口擴展了CrudRepository。
在CrudRepository的頂部有一個PagingAndSortingRepository 抽象,它增加了額外的方法來簡化對實體的分頁訪問。
public interface PagingAndSortingRepository<T, ID extends Serializable>extends CrudRepository<T, ID> {
IterablefindAll (Sort sort) ;
PagefindAll (Pageable pageable) ;
}
實現熱插拔
對于Java項目而言,在開發過程中,一個非常大的問題在于,每次在修改完文件之后都需要重新編譯、啟動,才能查看到最新的修改效果,這極大影響了開發效率。因此, Spring Boot提供了幾種熱插拔( Hot Swapping)方式。本節主要介紹如何來實現Spring Boot應用的熱插拔。
重新加載靜態內容
有多種熱加載的方式,推薦的方法是使用spring-boot-devtools,因為它提供了額外的功能,例如,支持快速應用程序重啟和LiveReload及智能的開發時配置(如模板緩存)。
以下是在Maven添加Devtools的方式。
<dependencies><dependency>
<groupId>org. springframework.bootgroupId>
<arti factId>spring-boot-devtoolsarti factId>
<optional>trueoptional>
dependency>
dependencies>
在Gradle添加Devtools則更加多簡潔。
dependencies{compile ("org. spr ingframework .boot :spring-boot-devtools")
}
Devtools通過監視類路徑的變更來實現熱加載。這意味著靜態資源更改必須構建才能使更改生效。不同的IDE觸發更新的方式有所不同。默認情況下,在Eclipse中,保存修改的文件將導致類路徑被更新并觸發重新啟動。在IntelliJ IDEA中,構建項目( Build -→Make Project )將具有相同的效果。
在IDE中運行(特別是調試)是另外-一個非常好的開發方式,因為幾乎所有現代IDE都允許重新加載靜態資源,通常還可以熱部署Java類的更改。
LiveReload
spring- boot- devtools模塊包括一個嵌入式LiveReload 服務器,可以在資源更改時用于觸發瀏覽器刷新。ht/iv/reload.com/excensions/ 網站為Chrome、Firefox 和Safari等免費提供了LiveReload瀏覽器的擴展程序。
如果不想在應用程序運行時啟動LiveReload服務器,則可以將spring devtools.livereload.enabled屬性設置為false。
需要注意的是,一次只能運行一個LiveReload服務器。應用程序啟動之前,請確保沒有其他LiveReload服務器正在運行。如果從IDE啟動多個應用程序,則只有第一個應用程序將 支持LiveReload。
重新加載模板
Spring Boot在大多數模板技術中,都有包括禁用緩存的配置選項。啟用這個禁用緩存的選項后,修改模板文件,就能自動實現模板的加載。如果使用spring -boot-devtools模塊,這些屬性將在開發時自動配置上。
下面是常用模板的禁用緩存的設置。
( 1 ) Thymeleaf
如果使用Thymeleaf,請設置spring.thymeleaf.cache為false。
( 2 ) FreeMarker
如果使用FreeMarker,請設置springfreemarker.cache為false。
(3) Groovy
如果使用Groovy,請設置spring.groovy.cache為false。
應用程序快速重啟
spring-boot-devtools模塊支持應用程序自動重新啟動。雖然并不像商業軟件JRebel那樣快,但通常比“冷啟動”快得多。所以,如果不想花費太多資源在這些商業軟件身上,不妨嘗試下Devtools。
重新加載Java類而不重新啟動容器
現代IDE (如Eclipse、IDEA 等)都支持字節碼的熱插拔,所以如果進行了不影響類或方法簽名的更改,那么應重新加載Java類,而不是重啟容器,這樣會更快、更干凈,而且不會因為重啟容器而產生副作用。
本文給大家介紹的內容是以Hibernate為實現的JPA,如何來實現SpringBoot應用的熱插拔
1.覺得文章不錯的小伙伴,可以轉發關注小編一下;
2.下篇文章給大家介紹微服務測試這一塊兒的內容;
3.感謝大家支持!!!!
推薦閱讀
如何在SpringBoot應用中實現跨域訪問資源和消息通信?
十年架構師爆肝分享:基于SpringSecurity實現的基本認證及OAuth2
5年資深架構師重點聚焦:SpringBoot的配置詳解+內嵌Servlet容器
總結
以上是生活随笔為你收集整理的jpa 不自动建表_如何来实现SpringBoot应用的JPA数据持久化和热插拔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python和c语言的对比_类C语言与P
- 下一篇: python生成100个随机数_Pyth