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