現代起亞計畫投研發汽車版 AlphaGo

近日,韓國圍棋傳奇人物李世石與Google公司人工智慧「AlphaGo」進行的人機大戰引發矚目。韓國車企表示,擬研發汽車版「AlphaGo」。

據韓國SBS電視台報導,為在2020年推出自動駕駛系統,現代起亞汽車將在研發自動駕駛系統方面投入共2萬億韓元。現代起亞汽車宣佈,自動駕駛汽車將在5年內上市。

目前賓士等公司也正在研發自動駕駛汽車,哪家企業率先面市自動駕駛汽車備受關注。

分析認為,人工智慧和汽車行業結合起來的落地前景無限,無人駕駛要求更多,隨時處理多因數事件。鑒於目前現代起亞汽車技術情況,2020年推出的自動駕駛汽車雖不完美,但可以接近完成。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

為什麼海龜會吃塑膠?不是因為餓 而是因為塑膠聞起來像食物

摘錄自2020年3月12日聯合新聞網報導

海龜為何要吃塑膠?一篇新研究提出新答案,這是因為塑膠味道在海龜鼻中聞起來就像食物。新論文發表在《當代生物學》(Current Biology)期刊。

美國佛羅里達大學團隊對此進行一項圈養 15 隻幼齡赤蠵龜(loggerhead sea turtle)的實驗。在實驗中,海龜被裝在水箱內,接著研究人員藉管子往水面上方釋放各種味道,發現海龜很大程度上對乾淨的水、乾淨的塑膠味無動於衷,卻在聞到浸泡過海水的塑膠後把頭探出水面,時間是其他味道的 三倍有餘,這種反應與聞到正常食物味道後的反應一樣。

研究人員表示,塑膠在海洋漂浮一陣子後會開始釋出一種化學物質,加上微生物、藻類定居在塑膠上,產生能吸引魚類、海鳥等生物的食物氣味;而出於相同原因,海龜也被這股「香味」給吸引了,誤以為塑膠是食物而把它吃掉。

國際新聞
海龜
一次性塑膠袋

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

Tesla Model 3 即將發表,售價3.5萬美元起

美國電動車商特斯拉(Tesla)即將在3月31日發表新款電動車Model 3,瞄準中階車款市場。Model 3定價僅有Model S的一半,未來年產量目標訂在50萬輛。

特斯拉將在加州設計工作室發表Model 3,美、歐民眾自發表日起即可開始預購,訂金分別是1,000美金與1,000歐元,最快將在2017年底於美國開始出貨,歐洲出貨最快則在2018年年底。Model 3的初步定價為3.5萬美元起,只有Model S的一半。特斯拉希望Model 3能幫助公司打入中階車款市場,並在2020年時讓年產量提高到50萬輛。目前,Model S的年產量約為5萬輛。

Model 3的車身較Model S短約20%,與奧迪A4為同級車款。據了解,Model 3配有四輪傳動與自動駕駛功能,每次充飽電後可行駛約500公里。Green Car Reports 預測,Model 3 所採用的電池將是矽-石墨稀複合材料陽極電池。Model 3問世,代表特斯拉也有量產大眾車款的實力。

然而,Model 3也有競爭者。通用汽車(GM)即將推出新款Chevrolet Bolt搶攻中階電動車市場,且Bolt將比Model 3提早一年開始出貨。雙方的競爭關係如何發展,也值得注目。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

聯合國2020全球幸福報告出爐 台灣第25名蟬聯東亞冠軍

摘錄自2020年3月21日自由時報報導

在武漢肺炎爆發以前,聯合國針對世界各國完成調查及評量,並按慣例發表了《2020年全球幸福報告》(World Happiness Report 2020)。今年最幸福國家由芬蘭拔得頭籌,蟬聯3屆冠軍寶座,排名最後則為阿富汗;在150多個國家及地區裡,台灣排名第25,蟬聯東亞最幸福國家冠軍。

其他亞洲地區和國家中,新加坡為第31名,香港較去年下降2個名次,今年為第78名,中國則為第94名,南韓與日本分別為第61和第62名;亞洲排名最後的國家為印度(144)和葉門(146)。其餘歐美國家中,英國拿下第13名,美國則為第18名。

《全球幸福報告》自2012年起開始製作,於每年3月20日「國際幸福日」發布,報告排名是依據人均GDP、社會支持、人均壽命、預期壽命、社會自由程度、寬容度、腐敗程度和公民幸福感調查等因素綜合評分;今年報告完成於武漢肺炎疫情爆發之前,究竟疫情將對各國造成何種影響,有待明年報告揭曉。

永續發展
國際新聞
幸福指數

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

特斯拉新Model S 2.9秒破百還能防霧霾

4月19日,特斯拉新Model S在位於北京金港汽車公園內的特斯拉金港體驗中心首發亮相,同時特斯拉在中國大陸的第十七家體驗中心、北京地區的第五家體驗中心正式揭幕。

特斯拉新Model S共分70、70D、90D和P90D四種配置,價格在73.57——104.85萬元。據特斯拉官方宣佈,新款車型可以享受4年或8萬公里整車質保,以及8年不限里程電動機和電池質保,且保養週期為超長2萬公里。

在外觀上,特斯拉新Model S最大的改變是採用了與Moled X相近的家族式前臉設計,取消了老款前臉的仿黑色格柵設計。同時,特斯拉新Model S可選配全LED動態轉向大燈,不僅能改善夜間駕駛能見度也使外觀更為時尚。前霧燈也有LED式光源可供選裝。

在內飾上,特斯拉新Model S將主駕與副駕之間原來空無的位置增加了儲物槽的設計。新車型還增加了花紋白蠟木和深色白蠟木兩種全新的內飾配色,另外還提供Nappa真皮座椅、Alcantara材質車頂供消費者選擇。

配置方面,特斯拉新Model S提供前排座椅通風/加熱、無鑰匙進入、雨量感應式雨刷、LED氛圍燈等都是標配配置。而後排座椅加熱、方向盤加熱為選裝配置。在選裝配置中,還加入了之前只裝配於Model X的HEPA高科技空氣過濾系統。HEPA高科技空氣過濾系統優於傳統豪華轎車所使用的空氣過濾系統,擁有過濾約99.97%的可吸入顆粒物及過敏源、細菌。

HEPA高科技空氣過濾系統還具有一個強大的功能:生化武器防禦模式。該模式的工作原理是通過空調系統在車內施加高於車外的氣壓,使車內空氣只能向車外流通,此時車外的空氣是無法通過車身縫隙進入車內,從而使生化武器無法對車內人員造成傷害。

全新的Model S動力性能與現款Model S相同。其中入門級的70和70D搭載70kWh電池,最大續航里程分別為455km和470km。主打車型P90D則搭載90kWh電池,續航557km。同時,P90D搭載了雙電動機,實現四輪驅動,百公里加速3.3s,狂暴模式下從靜止加速至100km/h僅需2.9s。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

西門子聯手法雷奧打造電動汽車動力總成領域的全球領導企業

西門子日前與法雷奧集團簽訂協定,雙方將共同組建一家從事高壓動力總成業務的合資企業,從而在創新和經濟型高壓元件及系統業務領域佔據全球領導地位。該合資企業的產品可搭載於各類電動汽車——包括混合動力、插電式混合動力和全電動汽車。在得到相關部門許可後,該合資公司預計將於 2016 年第四季度投入運營。

法雷奧將向合資公司注入包括其動力總成系統集團(PTS)旗下的高壓電力電子業務部門的 200 名員工,其中 90 人位於法國。西門子方面則由其電動汽車動力傳動業務部門為合資公司調配 500 名員工,其中 370 人位於德國,130 人在中國。合資公司將全權負責開發、銷售和生產電氣化乘用車和輕型商用車所需的 60 V以上的高壓電機和電力電子產品。合資公司能提供更加廣泛的產品線,從混合動力傳動模組和解決方案(包括電機、增程器、DC/DC 變流器、逆變器和充電器),到全電氣化動力系統等。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

前後端分離,我怎麼就選擇了 Spring Boot + Vue 技術棧?

前两天又有小夥伴私信松哥,問題還是職業規劃,Java 技術棧路線這種,實際上對於這一類問題我經常不太敢回答,每個人的情況都不太一樣,而小夥伴也很少詳細介紹自己的情況,大都是一兩句話就把問題拋出來了,啥情況都不了解,就要指出一個方向,這實在是太難了。

因此今天我想從我學習 Spring Boot + Vue 這套技術棧的角度,來和大家聊一聊沒有人指導,我是如何一步一步建立起自己的技術體系的。

線上大家看我經常寫文章,線下我其實比較宅,跟人交流比較少,我也很少問別人職業規劃或者技術規劃這些問題,因為這種學什麼的問題,我喜歡自己把握,我不太喜歡被別人牽着走。

Rome was not built in a day,剛開始接觸 Spring Boot + Vue 時,我甚至都沒有一個明確的想法,只是覺得該學點什麼,不能讓時間浪費,沒有告訴我 Spring Boot 要火了,也沒有人告訴我 Vue 要超過 React 了,都是我自己一直在摸索摸索,一步一步,直到構建起這套技術大廈。

Spring Boot

先說說 Spring Boot 吧,三年前差不多也是這個時候,是我第一次接觸 Spring Boot ,那個時候我的正式身份還是一名 Android 工程師,那段時間在研究 Android7 的源碼,還寫了一些博客:

但是那個時候 Android 的行情在慢慢下滑,而我剛畢業 1 年多,未來還有更加豐富的技術人生,我不願意這麼早就把技術棧定死,而且還定在一個行情日漸下滑的技術棧上。所以我打算學一點新的東西。

Python、Go、前端 和 Java 都是備選的方向,但是最終還是選擇繼續做 Java,有三個原因:

  • 做 Java 當時可以在公司內部轉崗,做 Python 或者 Go 的話,可能就得換工作了,技術棧切換,一切從頭開始,當時心裏還是沒底,於是就選擇繼續做 Java
  • 剛好大學的時候也有 JavaEE 的底子,重新撿起來 JavaEE 相關的技術點倒也不是啥難事
  • 第三點也是最重要的一點,我一直希望能夠獨立接點私活,這樣有一天賺錢能夠不受工作地點的限制,基於這樣的初衷,我一直希望走全棧的路線,用 Python 和 Go 雖然也可以做企業級應用,但是在目前的技術環境下,這並不算是主流方案,主流方案依然是 Java ,雖然它被被多人吐槽

基於以上三點,我決定還是走 Java 的方向吧。

2016 年那會,CSDN 幾乎每個月送我一本技術圖書,10 月份的圖書我就和夢鴿美女要了一本 Spring Boot 相關的書,書到了之後,一直在忙各種事情沒時間看,到了當年 12 月份的時候,公司安排我去深圳出差,出差的話,每天下班后時間就比較充裕了,於是我就帶上了書,每天下班回到酒店,就開始搞 Spring Boot。

一開始我就發現這玩意相比我大學時候搞得 XML 配置的 SSM 太好用了,還是 SSM 那套東西,但是有了自動化配置,不用再去寫讓人頭大的 XML 配置了,可以基於 Spring Boot 快速搞一個 SSM 應用出來。不過剛開始學的時候我還不知道 Spring Boot 在 Java 領域如此火爆,當我寫了幾篇博客之後,我發現每篇博客的閱讀量都暴漲,遠遠高於其他博客的閱讀,我隱隱約約感覺到這次稀里糊塗的技術棧切換,算是沒走錯路。

不過老實說,Spring Boot 技術棧其實不算難,都是 SSM 那一套東西,只是多了自動化配置(當然,Spring Boot 也有不少自己的東西,不過整體上基於 SSM 這點應該沒啥爭議),我剛開始搞 Spring Boot 的時候,有時候會有一些東西看的雲里霧裡,後來發現問題出在 Spring + SpringMVC 上,好幾年不寫 JavaEE,這些東西有一點點生疏了,後來又花了一些時間把 SSM 這些東西系統過了一遍,然後再去看 Spring Boot 就順暢多了。

所以有一些小夥伴問松哥能不能跳過 SSM 直接學習 Spring Boot,這個我不建議,大家在 Spring Boot 中見到的很多神奇的自動化配置大部分都是基於 Spring 現有功能實現的,要是不懂實現原理,你會發現 Spring Boot 用得時候雖然好用,但是出了問題,你就束手無策了。

就這樣,跳入了 Spring Boot 的坑裡了。Spring Boot 學完沒多久,工作上,馬上要從 Android 切換到 JavaEE 了,亟需一個項目練練手,當時我的上司給我介紹了一個西藏大學的項目,我使用 Spring Boot+EasyUI 的技術棧花了不到一個禮拜做完了,從此就算是叩開了 JavaEE 的大門,那會是 2017 年。

當時前端選擇 EasyUI 也是沒辦法,甲方催得緊,而我來不及搞其他的前端框架,當時只有 EasyUI 熟悉一些,不用花時間學,直接就能用,於是就選擇了 EasyUI,但是 EasyUI 太丑了,所以在做完西藏大學的項目后,我就一直思量着再整一個專業的前端框架,這樣以後再有私活,我就可以獨立做出來一個好看的後端管理系統了。

就這樣,在綜合對比了 Vue、React 以及 Angular 之後,決定跳入 Vue 的坑。

Vue

前端其實還算接觸的比較早,最早的 jQuery Mobile,PhoneGap 上大學的時候就玩過,我的第一本 NodeJS 的書是在 2013 年買的,那個時候 NodeJS 還算是一個比較新的事物。當我還是一名 Android 工程師的時候,我就玩過 React 和 ReactNative,RN 是當時比較流行的一個跨平台解決方案。但是在我比較這三個技術棧的時候,我發現 Vue 更加好用,生態也更加豐富,而且大有超過 React 的架勢(當時 Vue 在 GitHub 上的 star 數還沒超過 React),於是我就選擇了 Vue。其實當時我心裏想,大不了學完 Vue 再學 React,反正我才剛畢業兩年多,沒必要這麼早就鎖定技術棧停止學習。

Vue 的學習確實不費啥事,花了兩三天時間刷了一遍官網,然後就開始做項目,但是要去深入學習,又是一個漫長的過程了。

Vue 有很多漂亮的 UI 庫,像 ElementUI 等都算是做的比較好的,這些東西只要會用其中一個,其他的就可以手到擒來。

到 2018 年初,Spring Boot+Vue 技術棧基本上已經熟悉了,兩個開源項目 V 部落()和微人事()也受到小夥伴們的歡迎,常規的企業級應用可以一個人獨立完成了,5 月份的時候,經朋友介紹,接了哈爾濱工程大學一位老師的項目,毫無疑問我就使用了最擅長的 Spring Boot+Vue 技術棧來做了,前後端都是自己做,沒人扯皮,美滋滋。

再後來,就是寫書(),業餘繼續搞點項目用 Spring Boot + Vue 來做,這些以前都和大家聊過我就不再多說了,業餘接點項目來做這塊倒是有一些經驗,以後和小夥伴們細聊。

就這樣,沒有任何人的指引,我慢慢構建了 Spring Boot + Vue 這套技術體系,這個過程中,最大的學習經驗就是要寫博客,做筆記,寫博客不僅僅是記錄,也是總結提煉,在寫的過程中,融入自己的思考,加深對技術的理解。 掌握了這套技術棧之後,我覺得我離全棧又更近了一步,離賺錢不受工作地點的限制這個目標也更近一步了。

結語

有前輩大佬的指引,你可能走得快,自己摸索,走的踏實。其實從我第一天自學 Java 開始,基本上都是一直在摸索。大學時候一個 BUG 折騰兩三天才解決,但是一旦自己想明白解決了,以後類似的錯誤不會再犯,這是我的感受。

好了,一點點學習經驗,和小夥伴們分享,要是覺得有啟發,歡迎轉發哦。

掃碼關注松哥,公眾號後台回復 2TB,獲取松哥獨家 超2TB 學習資源

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

為讓包裝環保可回收 民眾寄洋芋片空包裝施壓

摘錄自2018年9月27日自由時報報導

綜合外媒報導,21日一名英國環保人士艾希克羅(Geraint Ashcroft)表示,英國人每年吃下60億包袋裝的洋芋片,且洋芋片的包裝是一次性不可回收,對環境會造成非常嚴重的損害,於是在推特上發起將洋芋片包裝寄回洋芋片公司的活動,許多民眾紛紛響應,將寄回洋芋片的照片放上推特,希望讓百事公司的洋芋片子公司「Walkers」正視環保問題。

「Walkers」發言人出面回應,表示的確收到許多民眾郵寄的空包裝,也意識到塑料包裝會造成環境問題,公司目前已將收到的空包裝用於研究其他包裝的可回收性,總公司並承諾道「2025年所有包裝將可100%回收、堆肥或生物分解」。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

駱駝集團8億元進軍新能源汽車動力電池領域

近日,駱駝集團股份有限公司公開發行可轉換公司債券預案,本次公開發行可轉換公司債券募集資金總額不超過 90,000 萬元,扣除發行費用後,募集資金用於以下項目:

駱駝集團此次5.5億用於建設年產7億Wh動力電池生產線可以看作是駱駝集團進軍電動汽車動力電池領域的信號。

早在今年三月,駱駝集團動力電池專案就已經正式開工建設,總投資高達20億元人民幣,預計建成後年產能達到50億瓦時鋰離子電池,並將大量供應給新能源汽車主機廠。不僅於此,駱駝集團還先後於2015年佈局了充電設施建設、新能源汽車租賃業務等新能源配套產業鏈。可見,駱駝集團在新能源汽車領域已籌畫多時,此次轉換公司債券預案的發佈只是一個開端,下一步還將會有新能源動力電池方面的大動作。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

SpringBoot系列教程JPA之指定id保存

原文鏈接:

前幾天有位小夥伴問了一個很有意思的問題,使用 JPA 保存數據時,即便我指定了主鍵 id,但是新插入的數據主鍵卻是 mysql 自增的 id;那麼是什麼原因導致的呢?又可以如何解決呢?

本文將介紹一下如何使用 JPA 的 AUTO 保存策略來指定數據庫主鍵 id

I. 環境準備

實際開始之前,需要先走一些必要的操作,如安裝測試使用 mysql,創建 SpringBoot 項目工程,設置好配置信息等,關於搭建項目的詳情可以參考前一篇文章

下面簡單的看一下後續的代碼中,需要的配置 (我們使用的是 mysql 數據庫)

1. 表準備

沿用前一篇的表,結構如下

CREATE TABLE `money` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶名',
  `money` int(26) NOT NULL DEFAULT '0' COMMENT '錢',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

2. 項目配置

配置信息,與之前有一點點區別,我們新增了更詳細的日誌打印;本篇主要目標集中在添加記錄的使用姿勢,對於配置說明,後面單獨進行說明

## DataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
## jpa相關配置
spring.jpa.database=MYSQL
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

II. Insert 教程

首先簡單的看一下,我們一般使用默認的數據庫自增生成主鍵的使用方式,以便後面的自定義主鍵生成策略的對比

對於 jpa 的插入數據的知識點不太清楚的同學,可以看一下之前的博文:

1. 自增主鍵

首先我們需要定義 PO,與數據庫中的表綁定起來

@Data
@DynamicUpdate
@DynamicInsert
@Entity
@Table(name = "money")
public class MoneyPO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "money")
    private Long money;

    @Column(name = "is_deleted")
    private Byte isDeleted;

    @Column(name = "create_at")
    @CreatedDate
    private Timestamp createAt;

    @Column(name = "update_at")
    @CreatedDate
    private Timestamp updateAt;
}

注意上面的主鍵生成策略用的是 GenerationType.IDENTITY,配合 mysql 的使用就是利用數據庫的自增來生成主鍵 id

/**
 * 新增數據
 * Created by @author yihui in 11:00 19/6/12.
 */
public interface MoneyCreateRepositoryV2 extends JpaRepository<MoneyPO, Integer> {
}

接下來保存數據就很簡單了

private void addWithId() {
    MoneyPO po1 = new MoneyPO();
    po1.setId(20);
    po1.setName("jpa 一灰灰 1x");
    po1.setMoney(2200L + ((long) (Math.random() * 100)));
    po1.setIsDeleted((byte) 0x00);
    MoneyPO r1 = moneyCreateRepositoryV2.save(po1);
    System.out.println("after insert res: " + r1);
}

強烈建議實際的體驗一下上面的代碼執行

首次執行確保數據庫中不存在 id 為 20 的記錄,雖然我們的 PO 對象中,指定了 id 為 20,但是執行完畢之後,新增的數據 id 卻不是 20

Hibernate: select moneypo0_.id as id1_0_0_, moneypo0_.create_at as create_a2_0_0_, moneypo0_.is_deleted as is_delet3_0_0_, moneypo0_.money as money4_0_0_, moneypo0_.name as name5_0_0_, moneypo0_.update_at as update_a6_0_0_ from money moneypo0_ where moneypo0_.id=?
Hibernate: insert into money (is_deleted, money, name) values (?, ?, ?)
after insert res: MoneyPO(id=104, name=jpa 一灰灰 1x, money=2208, isDeleted=0, createAt=null, updateAt=null)

上面是執行的 sql 日誌,注意插入的 sql,是沒有指定 id 的,所以新增的記錄的 id 就會利用 mysql 的自增策略

當我們的 db 中存在 id 為 20 的記錄時,再次執行,查看日誌發現實際執行的是更新數據

Hibernate: select moneypo0_.id as id1_0_0_, moneypo0_.create_at as create_a2_0_0_, moneypo0_.is_deleted as is_delet3_0_0_, moneypo0_.money as money4_0_0_, moneypo0_.name as name5_0_0_, moneypo0_.update_at as update_a6_0_0_ from money moneypo0_ where moneypo0_.id=?
Hibernate: update money set create_at=?, money=?, name=?, update_at=? where id=?
after insert res: MoneyPO(id=20, name=jpa 一灰灰 1x, money=2234, isDeleted=0, createAt=null, updateAt=null)

大膽猜測,save 的執行過程邏輯如

  • 首先根據 id 到數據庫中查詢對應的數據
  • 如果數據不存在,則新增(插入 sql 不指定 id)
  • 如果數據存在,則判斷是否有變更,以確定是否需要更新

2. 指定 id

那麼問題來了,如果我希望當我的 po 中指定了數據庫 id 時,db 中沒有這條記錄時,就插入 id 為指定值的記錄;如果存在記錄,則更新

要實現上面這個功能,自定義主鍵 id,那麼我們就需要修改一下主鍵的生成策略了,官方提供了四種

取值 說明
GenerationType.TABLE 使用一個特定的數據庫表格來保存主鍵
GenerationType.SEQUENCE 根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列
GenerationType.IDENTITY 主鍵由數據庫自動生成(主要是自動增長型)
GenerationType.AUTO 主鍵由程序控制

從上面四種生成策略說明中,很明顯我們要使用的就是 AUTO 策略了,我們新增一個 PO,並指定保存策略

@Data
@DynamicUpdate
@DynamicInsert
@Entity
@Table(name = "money")
public class AutoMoneyPO {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
    @GenericGenerator(name = "myid", strategy = "com.git.hui.boot.jpa.generator.ManulInsertGenerator")
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "money")
    private Long money;

    @Column(name = "is_deleted")
    private Byte isDeleted;

    @Column(name = "create_at")
    @CreatedDate
    private Timestamp createAt;

    @Column(name = "update_at")
    @CreatedDate
    private Timestamp updateAt;
}

採用自定義的生成策略,需要注意,@GenericGenerator(name = "myid", strategy = "com.git.hui.boot.jpa.generator.ManulInsertGenerator")這個需要有,否則執行會拋異常

這一行代碼的意思是,主鍵 id 是由ManulInsertGenerator來生成

/**
 *  自定義的主鍵生成策略,如果填寫了主鍵id,如果數據庫中沒有這條記錄,則新增指定id的記錄;否則更新記錄
 *
 *  如果不填寫主鍵id,則利用數據庫本身的自增策略指定id
 *
 * Created by @author yihui in 20:51 19/11/13.
 */
public class ManulInsertGenerator extends IdentityGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor s, Object obj) throws HibernateException {
        Serializable id = s.getEntityPersister(null, obj).getClassMetadata().getIdentifier(obj, s);

        if (id != null && Integer.valueOf(id.toString()) > 0) {
            return id;
        } else {
            return super.generate(s, obj);
        }
    }
}

具體的主鍵生成方式也比較簡單了,首先是判斷 PO 中有沒有主鍵,如果有則直接使用 PO 中的主鍵值;如果沒有,就利用IdentityGenerator策略來生成主鍵(而這個主鍵生成策略,正好是GenerationType.IDENTITY利用數據庫自增生成主鍵的策略)

接下來我們再次測試插入

// 使用自定義的主鍵生成策略
AutoMoneyPO moneyPO = new AutoMoneyPO();
moneyPO.setId(20);
moneyPO.setName("jpa 一灰灰 ex");
moneyPO.setMoney(2200L + ((long) (Math.random() * 100)));
moneyPO.setIsDeleted((byte) 0x00);
AutoMoneyPO res = moneyCreateRepositoryWithId.save(moneyPO);
System.out.println("after insert res: " + res);

moneyPO.setMoney(3200L + ((long) (Math.random() * 100)));
res = moneyCreateRepositoryWithId.save(moneyPO);
System.out.println("after insert res: " + res);

moneyPO = new AutoMoneyPO();
moneyPO.setName("jpa 一灰灰 2ex");
moneyPO.setMoney(2200L + ((long) (Math.random() * 100)));
moneyPO.setIsDeleted((byte) 0x00);
res = moneyCreateRepositoryWithId.save(moneyPO);
System.out.println("after insert res: " + res);

上面的代碼執行時,確保數據庫中沒有主鍵為 20 的數據,輸出 sql 日誌如下

# 第一次插入
Hibernate: select automoneyp0_.id as id1_0_0_, automoneyp0_.create_at as create_a2_0_0_, automoneyp0_.is_deleted as is_delet3_0_0_, automoneyp0_.money as money4_0_0_, automoneyp0_.name as name5_0_0_, automoneyp0_.update_at as update_a6_0_0_ from money automoneyp0_ where automoneyp0_.id=?
Hibernate: insert into money (is_deleted, money, name, id) values (?, ?, ?, ?)
after insert res: AutoMoneyPO(id=20, name=jpa 一灰灰 ex, money=2238, isDeleted=0, createAt=null, updateAt=null)

# 第二次指定id插入
Hibernate: select automoneyp0_.id as id1_0_0_, automoneyp0_.create_at as create_a2_0_0_, automoneyp0_.is_deleted as is_delet3_0_0_, automoneyp0_.money as money4_0_0_, automoneyp0_.name as name5_0_0_, automoneyp0_.update_at as update_a6_0_0_ from money automoneyp0_ where automoneyp0_.id=?
Hibernate: update money set create_at=?, money=?, update_at=? where id=?
after insert res: AutoMoneyPO(id=20, name=jpa 一灰灰 ex, money=3228, isDeleted=0, createAt=null, updateAt=null)

# 第三次無id插入
Hibernate: insert into money (is_deleted, money, name) values (?, ?, ?)
after insert res: AutoMoneyPO(id=107, name=jpa 一灰灰 2ex, money=2228, isDeleted=0, createAt=null, updateAt=null)

注意上面的日誌輸出

  • 第一次插入時拼裝的寫入 sql 是包含 id 的,也就達到了我們指定 id 新增數據的要求
  • 第二次插入時,因為 id=20 的記錄存在,所以執行的是更新操作
  • 第三次插入時,因為沒有 id,所以插入的 sql 中也沒有指定 id,使用 mysql 的自增來生成主鍵 id

II. 其他

0. 項目&博文

  • 工程:
  • module:

1. 一灰灰 Blog

盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現 bug 或者有更好的建議,歡迎批評指正,不吝感激

下面一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛

  • 一灰灰 Blog 個人博客
  • 一灰灰 Blog-Spring 專題博客

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

※評比彰化搬家公司費用,南投搬家公司費用收費行情懶人包大公開

彰化搬家費用,南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!