成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個遲來的贊,送給JPA。AbstractEntity需要準備些什么?

運維 數據庫運維
關系型數據庫其實很討人厭,尤其是在你使用數據庫驅動的開發模式時。需要首先把表給創建好了,然后再使用代碼生成器反向生成一堆幾乎無法可讀的代碼。當字段有變更的時候,又是一番折騰。

[[383046]]

本文轉載自微信公眾號「小姐姐味道」,作者小姐姐養的狗02號。轉載本文請聯系小姐姐味道公眾號。   

本篇屬于代碼解析系列文章之一,主要內容是JPA的基礎父類設計。參考代碼:https://github.com/xjjdog/bcMall/blob/master/bc-utils/src/main/java/cn/xjjdog/bcmall/utils/db/AbstractEntity.java

關系型數據庫其實很討人厭,尤其是在你使用數據庫驅動的開發模式時。需要首先把表給創建好了,然后再使用代碼生成器反向生成一堆幾乎無法可讀的代碼。當字段有變更的時候,又是一番折騰。

這其中的典型,就是MyBatis,所以催生了更加簡潔的MyBatis Plus。

了解到一些大廠(阿里、騰訊、抖音等),JPA的使用也越來越廣泛了,包括我們公司,這是把合適的工具放到了合適的地方。如果想要快速開發,JPA無疑是一個比較好的選擇。你無需關注數據庫表的結構,使用代碼驅動即可完成工作,管它后面是MySQL還是Oracle。JPA把數據庫相關的知識給弱化了,讓你專注于業務開發。

我個人曾是非常排斥JPA這種弱化SQL的工具的,這源于對早起Hibernate版本的錯誤認識。但嘗試過mybatis、spring-data-jdbc、jooq后,發現這個東西是真的香!一個遲到的贊,送給JPA。

 

 


 

 

這對一些管理系統來說,非常合適。因為性能并不是這些系統主要的痛點,業務復雜性才是。

本文將介紹一個簡單的實體類,需要準備哪些基本字段。這些字段,又是如何在代碼中被使用的。

1. 基本字段介紹

首先看一下我們的基礎定義類。

代碼不多,信息卻不少。

 

下面來一行行解析。

  1. @Data 

Data注解是屬于lombok類的,lombok是地球人都知道的代碼簡化工具,提供了非常多的注解。如果你不想記憶太多的注解,直接加上一個Data,是最偷懶的選擇。

  1. @MappedSuperclass 

這個注解是JPA的,用來標識父類。標注為@MappedSuperclass的類將不是一個完整的實體類,不會映射到數據庫表,但是它的屬性都將映射到子類的數據庫字段中。放在這里再合適不過了。

  1. @EntityListeners(AuditingEntityListener.class) 

開啟自動審計功能,這個和下面的兩個日期字段是相互配合的,我們稍后介紹。

  1. @JsonIgnoreProperties(value = {"hibernateLazyInitializer""handler"}) //直接使用bean時,避免json序列號失敗 

有時候,我們想要再controller層直接使用JPA的實體。但JPA內部其實是有很多附加變量的,比如hibernateLazyInitializer。

為了讓實體在json序列化的時候能夠正常進行,需要忽略這兩個字段。所以這個注解,是屬于jackson json的。

2. 自定義ID生成器

JPA其實提供了非常多的ID生成策略。不過,在互聯網應用下,應用較多的還是雪花算法,因為它有著良好的擴展性,在數據遷移的時候也不會有很多沖突。

為了指定雪花算法,我們需要下面幾行代碼。

  1. static final String ID_GEN = "cn.xjjdog.bcmall.utils.db.DistributedId"
  2.    @Id 
  3.    @GenericGenerator(name = "IdGen", strategy = ID_GEN) 
  4.    @GeneratedValue(generator = "IdGen"

其中的一個關鍵,就是使用我們名稱叫做IdGen的ID生成器。這里的代碼,是有一點小遺憾的。由于JVM類加載的緣故,我們無法在注解中直接使用類的名稱(*.class.getName()) 來獲取它的包路徑,只能作為字符串寫死在這里。

下面我們就來看一下這個ID生成器的處理。

  1. public class DistributedId implements IdentifierGenerator { 
  2.     @Override 
  3.     public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object obj) throws HibernateException { 
  4.         if (obj == null) throw new HibernateException(new NullPointerException()) ; 
  5.         if ((((AbstractEntity) obj).getId()) == null) { 
  6.             return String.valueOf(Snowflake.createId()); 
  7.         } else { 
  8.             return ((AbstractEntity) obj).getId(); 
  9.         } 
  10.     } 

代碼如上。在直接使用之前,我們還做了一點小處理。當我們判斷實體的ID為空的時候,才使用雪花算法構造一個新的ID;否則使用實體原來設置好的ID,保持不變。

為什么這樣做?因為這是有需求的。像訂單這種業務,你需要先生成一個訂單號,然后再更新一些數據庫信息,發布一些消息等;而不是在保存動作出發的時候才生成一個。

如果你不做上面代碼的處理。JPA將每次保存的時候都自動生成一個,覆蓋了你原有的。我就在這里吃過虧,通過debug代碼才進行的修復。

3. 自動填充字段

上面說到createdDate和lastModifiedDate兩個字段,其實在使用的時候,是不需要手動去設值的。這兩個值,將通過審計功能自動完成。

  1. @EntityListeners(AuditingEntityListener.class) 

當然,我們還要用特有的注解,來標識這兩個字段。

  1. /** 
  2. * 創建時間 
  3. */ 
  4. @CreatedDate 
  5. private Date createdDate; 
  6.  
  7. /** 
  8.  * 更新時間 
  9. */ 
  10. @LastModifiedDate 
  11. private Date lastModifiedDate; 

最后,不要忘了在全局配置中通過Config開啟這個功能。

  1. @Configuration 
  2. @EnableJpaAuditing 
  3. public class JpaConfig { 

當然,審計是不能沒有用戶的。所以這個系列還有@CreatedBy注解,用來標注是誰創建的。你需要在代碼中組裝它們,比如下面的代碼,就是從Spring Sercurity中獲取用戶信息。

  1. @Configuration 
  2. @Slf4j 
  3. public class UserAuditor implements AuditorAware<String> { 
  4.     @Override 
  5.     public Optional<String> getCurrentAuditor() { 
  6.         UserDetails user
  7.         try { 
  8.             user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
  9.             return Optional.ofNullable(user.getUsername()); 
  10.         }catch (Exception e){ 
  11.             return Optional.empty(); 
  12.         } 
  13.     } 

4. End

JPA寫管理系統,真的是神器。當你不需要考慮極限的代碼效率時,是一個非常好的選擇。再看看最近的MyBatis版本,包括MyBatis Plus設計,很多東西已經和JPA越來越像了。因為在設計上來說,JPA是最接近面向對象編程的思想的。

B端復雜業務的技術棧,并不需要和C端的技術棧相雷同。JPA顯然通過極少的代碼和約定,就能把事情搞定,讓開發者真正的把重點關注到業務開發上來。后面的文章,我們還會用到MyBatis和MyBatis Plus,到時候,我們再詳細分析它們使用的場景。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2015-10-27 15:50:47

JS框架

2020-03-16 09:31:10

Linux系統CentOS

2022-03-03 08:02:55

數據集成平臺

2011-07-15 16:45:23

技術人員

2021-09-12 17:23:57

canvas動畫函數

2017-11-14 11:12:50

Go語言編譯器

2013-12-19 13:25:40

InnoDB數據庫

2017-06-22 10:44:55

Linux調試器準備環境

2021-06-06 16:15:57

地區接口項目

2024-05-06 09:35:05

AI網關開源

2014-02-11 10:09:37

中小企業UC

2014-11-12 10:26:25

Bootstrap

2021-12-13 06:23:14

TCP三次握手網絡

2015-02-09 10:47:25

PaaSDeisHeroku

2010-04-13 00:02:22

Visual StudIDE

2017-11-09 18:10:59

程序員騰訊面試官

2022-04-28 13:56:10

元宇宙虛擬交易NFT

2024-05-15 10:07:11

Agents人工智能CSV

2013-11-22 13:25:57

數據中心云計算

2016-01-28 10:04:09

Jenkins運維持續交付
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人精品二区三区99精品 | 一区二区精品视频 | 成年人黄色小视频 | 伊人久久伊人 | 久久99精品久久久 | 国产午夜亚洲精品不卡 | www.久久 | 久久久久久国产 | 黄色在线观看网址 | 在线视频h | 国产成人99久久亚洲综合精品 | 亚洲精品中文字幕在线 | 亚洲色视频 | 久久久青草婷婷精品综合日韩 | 欧美日韩国产一区二区 | 999国产视频 | 欧美九九 | 欧美日韩精品一区二区三区视频 | 中文字幕三区 | av电影一区 | 亚洲不卡 | 粉嫩国产精品一区二区在线观看 | 中文字幕第二十页 | 国产精品精品视频一区二区三区 | 欧美寡妇偷汉性猛交 | 成人三区 | 免费一区二区三区 | 色噜噜亚洲男人的天堂 | 一区二区在线免费观看视频 | 亚洲 欧美 日韩 在线 | 亚洲综合国产精品 | 蜜桃av一区二区三区 | 久久久亚洲一区 | 欧美激情精品久久久久久变态 | 在线观看国产wwwa级羞羞视频 | 精品国产一区二区国模嫣然 | 国产成人福利 | 日日爱视频 | 超碰在线人人干 | 成人性视频免费网站 | 超碰日本|