spring boot + jquery 除錯點滴
spring boot + jquery EasyUI 除錯點滴
1
springdatajpa是很好用 的一個工具,但是!首先你要會用
今天下午就被一個spring-data-jpa的問題卡了略久,因為想要用mysql自增id,想要在save之後獲取這個儲存的實體的id進行後續的工作,一直以為springdatajpa中的save方法執行結束之後,save(entity)中的entity就會自動被更新為儲存的entity,但是其實不是這樣的,今天用intellij的debug工具跟蹤程式碼,發現save之後這個實體的id總是為0,既然這樣那用save返回的entity的id總該行了吧,改了之後發現save返回的entity的id也是0,這就很尷尬了
上網谷歌一下,找到一個說要在save之後flush一下這個repository,然而試了之後並沒有什麼卵用
繼續谷歌,發現一個springdatajpa的坑,springdatajpa其實是hibernate的一個比較高階的封裝庫,更好用了,但是底層還是用hibernate實現的,save方法其實就是hibernate的持久化方法,它是不會自動返回儲存的實體的,那要怎麼獲取到這個儲存的實體呢?
@GeneratedValue(strategy = GenerationType.IDENTITY)
- 1
必須要加上這句話,spring data jpa才會知道你想要拿到這個儲存後的實體,再返回這個實體
在你想要拿到自增id的列上加上@GeneratedValue,spring data jpa就會儲存這個實體,並更新傳入的實體為儲存後的實體(其實就是hibernate返回了一下吧我覺得),這樣的話,save(xxx)後xxx就已經更新為已經儲存的實體了
spring-data-jpa之坑,記錄備忘
2 https://docs.spring.io/spring-data/jpa/docs/1.10.11.RELEASE/reference/html/#jpa.entity-persistence.saving-entites
spring jpa 參考文件
3 關於級聯
CascadeType.PERSIST:級聯新增(又稱級聯儲存):對order物件儲存時也對items裡的物件也會儲存。對應EntityManager的presist方法
例子:只有A類新增時,會級聯B物件新增。若B物件在資料庫存(跟新)在則拋異常(讓B變為持久態)
CascadeType.MERGE:級聯合並(級聯更新):若items屬性修改了那麼order物件儲存時同時修改items裡的物件。對應EntityManager的merge方法
例子:指A類新增或者變化,會級聯B物件(新增或者變化)
CascadeType.REMOVE:級聯刪除:對order物件刪除也對items裡的物件也會刪除。對應EntityManager的remove方法
例子:REMOVE只有A類刪除時,會級聯刪除B類;
CascadeType.REFRESH:級聯重新整理:獲取order物件裡也同時也重新獲取最新的items時的物件。對應EntityManager的refresh(object)方法有效。即會重新查詢資料庫裡的最新資料 (用的比較少)
CascadeType.ALL:以上四種都是
綜上所述:一般的,用CascadeType.MERGE:級聯合並(級聯更新)就能達到級更新同時又穩定不報錯。
4 spring boot 在生成的表中,欄位名名問題:
例如 類的屬性startTime 會自動 生成 start_time 。
5
一些springboot小技巧、小知識點。
初始化資料
我們在做測試的時候經常需要初始化匯入一些資料,如何來處理呢?會有兩種選擇,一種是使用Jpa,另外一種是Spring JDBC。兩種方式各有區別下面來詳細介紹。
使用Jpa
在使用spring boot jpa的情況下設定spring.jpa.hibernate.ddl-auto的屬性設定為 create or create-drop的時候,spring boot 啟動時預設會掃描classpath下面(專案中一般是resources目錄)是否有import.sql,如果有機會執行import.sql指令碼。
使用Spring JDBC
使用Spring JDBC 需要在配置檔案中新增以下配置
spring:
datasource:
schema: database/data.sql
sql-script-encoding: utf-
8
jpa:
hibernate:
ddl-auto: none
- schema :設定指令碼的路徑
- sql-script-encoding:設定指令碼的編碼
spring boot專案啟動的時候會自動執行指令碼。
ddl-auto 四個值的解釋
- create: 每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。
- create-drop :每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
- update:最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據 model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等 應用第一次執行起來後才會。
- validate :每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。 5、 none : 什麼都不做。
不同點
第一種方式啟動的時候Jpa會自動建立表,import.sql只負責建立表單後的初始化資料。第二種方式啟動的時候不會建立表,需要在初始化指令碼中判斷表是否存在,再初始化指令碼的步驟。
在生產中,這兩種模式都建議慎用!
thymeleaf 設定不校驗html標籤
預設配置下,thymeleaf對.html的內容要求很嚴格,比如,如果少封閉符號/,就會報錯而轉到錯誤頁。也比如你在使用Vue.js這樣的庫,然後有<div v-cloak></div>這樣的html程式碼,也會被thymeleaf認為不符合要求而丟擲錯誤。
通過設定thymeleaf模板可以解決這個問題,下面是具體的配置:
spring.thymeleaf.cache=
false
spring.thymeleaf.mode=LEGACYHTML5
LEGACYHTML5需要搭配一個額外的庫NekoHTML才可用 專案中使用的構建工具是Maven新增如下的依賴即可完成:
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>
1.9
.
22
</version>
</dependency>
隨機埠
為Spring Cloud的應用實用隨機埠非常簡單,主要有兩種方法:
設定server.port=0,當應用啟動的時候會自動的分配一個隨機埠,但是該方式在註冊到Eureka的時候會一個問題:所有例項都使用了同樣的例項名(如:Lenovo-test:hello-service:0),這導致只出現了一個例項。所以,我們還需要修改例項ID的定義,讓每個例項的ID不同,比如使用隨機數來配置例項ID:
server.port=
0
eureka.instance.instance-id=${spring.application.name}:${random.
int
}
除了上面的方法,實際上我們還可以直接使用random函式來配置server.port。這樣就可以指定埠的取值範圍,比如:
server.port=${random.
int
[
10000
,
19999
]}
由於預設的例項ID會由server.port拼接,而此時server.port設定的隨機值會重新取一次隨機數,所以使用這種方法的時候不需要重新定義例項ID的規則就能產生不同的例項ID了。
Jtable : CRUD
http://www.jtable.org/?jTableStyle=jqueryui-redmond
http://www.programming-free.com/2014/02/jtable-pagination-in-java-web.html
http://www.programming-free.com/2013/08/ajax-based-crud-operations-in-java-web.html
.ParamQuery grid
https://paramquery.com/demos 關注:Row editing遭遇:
解決:@JsonIgnore