最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分享JPA的幾個(gè)小技巧

 更新時(shí)間:2021年03月12日 09:59:41   作者:小姐姐味道  
這篇文章主要分享了JPA的幾個(gè)小技巧,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

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

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

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

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

這對一些管理系統(tǒng)來說,非常合適。因?yàn)樾阅懿⒉皇沁@些系統(tǒng)主要的痛點(diǎn),業(yè)務(wù)復(fù)雜性才是。

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

1. 基本字段介紹

首先看一下我們的基礎(chǔ)定義類。

代碼不多,信息卻不少。

下面來一行行解析。

@Data

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

@MappedSuperclass

這個(gè)注解是JPA的,用來標(biāo)識(shí)父類。標(biāo)注為@MappedSuperclass的類將不是一個(gè)完整的實(shí)體類,不會(huì)映射到數(shù)據(jù)庫表,但是它的屬性都將映射到子類的數(shù)據(jù)庫字段中。放在這里再合適不過了。

@EntityListeners(AuditingEntityListener.class)

開啟自動(dòng)審計(jì)功能,這個(gè)和下面的兩個(gè)日期字段是相互配合的,我們稍后介紹。

@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}) //直接使用bean時(shí),避免json序列號(hào)失敗

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

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

2. 自定義ID生成器

JPA其實(shí)提供了非常多的ID生成策略。不過,在互聯(lián)網(wǎng)應(yīng)用下,應(yīng)用較多的還是雪花算法,因?yàn)樗兄己玫臄U(kuò)展性,在數(shù)據(jù)遷移的時(shí)候也不會(huì)有很多沖突。

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

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

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

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

public class DistributedId implements IdentifierGenerator {
 @Override
 public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object obj) throws HibernateException {
  if (obj == null) throw new HibernateException(new NullPointerException()) ;
  if ((((AbstractEntity) obj).getId()) == null) {
   return String.valueOf(Snowflake.createId());
  } else {
   return ((AbstractEntity) obj).getId();
  }
 }
}

代碼如上。在直接使用之前,我們還做了一點(diǎn)小處理。當(dāng)我們判斷實(shí)體的ID為空的時(shí)候,才使用雪花算法構(gòu)造一個(gè)新的ID;否則使用實(shí)體原來設(shè)置好的ID,保持不變。

為什么這樣做?因?yàn)檫@是有需求的。像訂單這種業(yè)務(wù),你需要先生成一個(gè)訂單號(hào),然后再更新一些數(shù)據(jù)庫信息,發(fā)布一些消息等;而不是在保存動(dòng)作出發(fā)的時(shí)候才生成一個(gè)。

如果你不做上面代碼的處理。JPA將每次保存的時(shí)候都自動(dòng)生成一個(gè),覆蓋了你原有的。我就在這里吃過虧,通過debug代碼才進(jìn)行的修復(fù)。

3. 自動(dòng)填充字段

上面說到createdDatelastModifiedDate兩個(gè)字段,其實(shí)在使用的時(shí)候,是不需要手動(dòng)去設(shè)值的。這兩個(gè)值,將通過審計(jì)功能自動(dòng)完成。

@EntityListeners(AuditingEntityListener.class)

當(dāng)然,我們還要用特有的注解,來標(biāo)識(shí)這兩個(gè)字段。

/**
* 創(chuàng)建時(shí)間
*/
@CreatedDate
private Date createdDate;

/**
 * 更新時(shí)間
*/
@LastModifiedDate
private Date lastModifiedDate;

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

@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

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

@Configuration
@Slf4j
public class UserAuditor implements AuditorAware<String> {
 @Override
 public Optional<String> getCurrentAuditor() {
  UserDetails user;
  try {
   user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
   return Optional.ofNullable(user.getUsername());
  }catch (Exception e){
   return Optional.empty();
  }
 }
}

4. End

JPA寫管理系統(tǒng),真的是神器。當(dāng)你不需要考慮極限的代碼效率時(shí),是一個(gè)非常好的選擇。再看看最近的MyBatis版本,包括MyBatis Plus設(shè)計(jì),很多東西已經(jīng)和JPA越來越像了。因?yàn)樵谠O(shè)計(jì)上來說,JPA是最接近面向?qū)ο缶幊痰乃枷氲摹?/p>

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

以上就是分享JPA的幾個(gè)小技巧的詳細(xì)內(nèi)容,更多關(guān)于JPA 技巧的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

山西省| 新源县| 临漳县| 岱山县| 奈曼旗| 博爱县| 田东县| 商洛市| 宁德市| 邵阳市| 广德县| 牙克石市| 大邑县| 海盐县| 四会市| 鹤山市| 台中市| 福海县| 崇州市| 银川市| 苍山县| 花垣县| 顺昌县| 铅山县| 八宿县| 花莲县| 响水县| 岳阳市| 墨玉县| 彭水| 崇仁县| 林州市| 南乐县| 瑞昌市| 深圳市| 沂水县| 青神县| 湖口县| 平遥县| 讷河市| 稻城县|